修改AngularJS中链接函数的范围

时间:2012-12-26 11:22:42

标签: angularjs

通常在AngularJS的所有示例/源代码中,范围的修改都在控制器中完成。在我的指令中,我需要从另一个指令(或它的范围)获取一些信息并将其放入范围(在指令模板中可见)。由于此信息对于此指令的所有实例都是通用的,因此使用范围绑定对我来说听起来不太好。

所以我找到的唯一解决方案是在链接函数中修改实例范围:

link: function(scope, element, attr, parentCtrl) {      
  scope.data = parentCtrl.someData;      
}

此解决方案有效。 Plnkr example

问题:根据AngularJS哲学/风格来修改链接功能的范围还是有其他解决方案?

2 个答案:

答案 0 :(得分:1)

修改指令中的范围很好。至于在指令之间共享信息,有几种方法。一个是你描述的方式,你访问父控制器并获取它的数据,另一个非常类似的方法是

scope.data = scope.$parent.data;  

而不是

scope.data = parentCtrl.someData;  

在指令之间共享内容的一般方法是使用服务。这将允许您将服务注入每个指令,并且它们可以共享值。初始方法(以及我所描述的方法)的问题在于,如果您移动元素以使范围的层次结构发生更改,则代码将会中断。这就是为什么我建议使用两者的服务。我建议阅读service docs。还有很多视频介绍如何设置它们:http://www.youtube.com/watch?v=1OALSkJGsRw

答案 1 :(得分:1)

由于您在指令中创建了隔离范围(在示例中为plnkr),并且您希望允许父项在范围层次结构中“某处”(根据您对@MathewBerg的注释) ),我相信你唯一的选择是使用链接功能来修改范围。

(我想你可以在你的MainCtrl上定义只有子指令应该调用的方法,但强制执行它会很麻烦并打破封装)。

因此,要回应@MathewBerg已经说过的内容,是的,修改指令/链接功能中的范围。