通常在AngularJS的所有示例/源代码中,范围的修改都在控制器中完成。在我的指令中,我需要从另一个指令(或它的范围)获取一些信息并将其放入范围(在指令模板中可见)。由于此信息对于此指令的所有实例都是通用的,因此使用范围绑定对我来说听起来不太好。
所以我找到的唯一解决方案是在链接函数中修改实例范围:
link: function(scope, element, attr, parentCtrl) {
scope.data = parentCtrl.someData;
}
此解决方案有效。 Plnkr example
问题:根据AngularJS哲学/风格来修改链接功能的范围还是有其他解决方案?
答案 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已经说过的内容,是的,修改指令/链接功能中的范围。