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

Her*_*Kan 4 angularjs

我需要得到父控制器,所以我的指令有一个require属性,如下所示:

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

但是,link函数的ctrl参数返回当前指令的控制器,而不是父节点的控制器.AngularJS文档清楚地表明了这一点:

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

我究竟做错了什么?

And*_*ger 10

无论是文档或代码被误导......在这里require^在当前元素的外观,然后将所有的父母,使用inheritedData方法(见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):

controller: function($element) {
    var parentForm = $element.parent().controller('form');
}
Run Code Online (Sandbox Code Playgroud)

考虑到这一点,您应该能够调用element.parent().controller('tag')以在控制器或postLink方法中找到父控制器.