在 AngularJS 中递归访问父指令的控制器

2024-03-24

我需要获取父级的控制器,因此我的指令有一个 require 属性,如下所示:

module.directive('tag', function () {
    return {
        require: '?^tag',
        restrict: 'E',
        controller: function () {
            this.payload = getPayload();
        },
        link: function (scope, element, attrs, ctrl) {
            usePayload(ctrl.payload);
        }
    };
});

然而,链接函数的 ctrl 参数返回当前指令的控制器,而不是父指令的控制器。 AngularJS 文档对此说得很清楚:

?^ - 尝试通过搜索元素的父元素来定位所需的控制器,如果未找到则返回 null。

我究竟做错了什么?


这里的文档或代码都具有误导性......require with ^查看当前元素,然后查看所有父元素,使用inheritedData方法(参见https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L942 https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L942)。因此,使用这种方法,您将无法从父级请求具有相同名称的指令。

当我过去遇到这个问题时,我看过form指令需要执行您所要求的操作。它的控制器方法像这样抓取父级(https://github.com/angular/angular.js/blob/master/src/ng/directive/form.js#L39 https://github.com/angular/angular.js/blob/master/src/ng/directive/form.js#L39):

controller: function($element) {
    var parentForm = $element.parent().controller('form');
}

采取这个,你应该能够打电话element.parent().controller('tag')在控制器或 postLink 方法中查找父控制器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 AngularJS 中递归访问父指令的控制器 的相关文章

随机推荐