2013-10-11 50 views
4

我需要得到父母的控制,所以我的指令有一个需要属性,如下所示:递归访问父指令的控制器AngularJS

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。

我在做什么错?

+1

'require:'?^ parent''或将指令的控制器赋值给父控制器的名称,或者将指令的控制器放在一起,并且链接参数中的'ctrl'将默认为父类型。 –

+0

请看[John Lindquist]的视频(http://egghead.io/lessons/angularjs-directive-communication),它可以很好地解释嵌套指令之间的通信。 –

+0

@ m.e.conroy:我必须在'require'中使用相同的名称。如果没有声明控制器,'ctrl'默认为'undefined'。 –

回答

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'); 
} 

考虑这一点,你应该能够调用element.parent().controller('tag')发现无论是在控制器或postLink方法父控制器。

+1

这个作品,谢谢!我唯一担心的是'controller()'方法没有在其API中公开,因此不打算供公众使用,并且可能会有所改变。 –

+0

Docs可以被隐藏在'angular.element'的文件中:http://docs.angularjs.org/api/angular.element。这是肯定记录在不稳定的分支,但我没有检查稳定。 – Andyrooger

+0

这非常有帮助。谢谢,我想制作一个可以作为自己的容器的元素,所以,这是完美的。另外,我读过将元素传递给控制器​​不是一个好主意,因此您可以始终使用链接函数中的元素 –

相关问题