我需要得到父控制器,所以我的指令有一个require属性,如下所示:
module.directive('tag', function () {
return {
require: '?^tag',
restrict: 'E',
controller: function () {
this.payload = getPayload();
},
link: function (scope, element, attrs, ctrl) {
usePayload(ctrl.payload);
}
};
});
然而,link函数的ctrl参数返回当前指令的控制器,而不是父指令的控制器。 AngularJS文档很清楚:
?^ - 尝试通过搜索元素的父元素来找到所需的控制器,如果未找到则返回null。
我做错了什么?
答案 0 :(得分:10)
文档或代码在这里有误导性...... require
^
使用inheritedData
方法查看当前元素,然后查看所有父元素(请参阅{{3} })。因此,您无法使用此方法从父级请求具有相同名称的指令。
当我过去遇到这个问题时,我已经查看了form
指令,该指令需要按照您的要求进行操作。它的控制器方法像这样抓取父(https://github.com/angular/angular.js/blob/master/src/ng/compile.js#L942):
controller: function($element) {
var parentForm = $element.parent().controller('form');
}
考虑到这一点,你应该能够调用element.parent().controller('tag')
在控制器或postLink方法中找到父控制器。