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

访问父指令';s控制器在AngularJS中的递归,angularjs,Angularjs,我需要获取父级的控制器,因此我的指令有一个require属性,如下所示: module.directive('tag',function(){ 返回{ 要求:“?^tag”, 限制:'E', 控制器:函数(){ this.payload=getPayload(); }, 链接:函数(范围、元素、属性、ctrl){ 使用有效载荷(ctrl.payload); } }; }); 但是,link函数的ctrl参数返回当前指令的控制器,而不是父指令的控制器。AngularJS文档对此非常清楚: ?^-

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

module.directive('tag',function(){
返回{
要求:“?^tag”,
限制:'E',
控制器:函数(){
this.payload=getPayload();
},
链接:函数(范围、元素、属性、ctrl){
使用有效载荷(ctrl.payload);
}
};
});
但是,link函数的ctrl参数返回当前指令的控制器,而不是父指令的控制器。AngularJS文档对此非常清楚:

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


我做错了什么?

这里的文档或代码有误导性
require
with
^
使用
inheritedData
方法查看当前元素,然后查看所有父元素(请参阅)。因此,使用这种方法,您将无法从父级请求具有相同名称的指令

当我过去遇到这个问题时,我已经查看了
表单
指令,它需要执行您要求的操作。它的controller方法像so()一样抓取父对象:


这样,您应该能够调用
element.parent().controller('tag')
在controller或postLink方法中查找父控制器。

要求:“?^parent”
或将指令的控制器分配给父控制器的名称,或将指令的控制器全部关闭,链接参数中的
ctrl
将默认为父控制器。请观看此视频这很好地解释了嵌套指令之间的通信。@m.e.conroy:我必须在
require
中使用相同的名称。如果未声明任何控制器,
ctrl
默认为
undefined
@JonathanPalumbo:该示例不是递归的,这意味着指令名称不同。这很有效,谢谢!我唯一担心的是
controller()
方法未在其API中公开,因此不打算用于公共用途,可能会发生更改。可以在
angular.element
中找到隐藏的文档。这在不稳定的分支中有明确的记录,但我没有检查稳定。这非常有用。谢谢,我想制作一个元素,它可以作为自己的容器,所以,这是完美的。另外,我已经读到将元素传递给控制器不是一个好主意,这样您就可以始终在link函数中使用元素
controller: function($element) {
    var parentForm = $element.parent().controller('form');
}