4

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

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

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

此解决方案有效。Plnkr 示例

问题:是否可以根据 AngularJS 哲学/风格修改链接功能的范围,还是有另一种解决方案?

4

2 回答 2

1

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

scope.data = scope.$parent.data;  

代替

scope.data = parentCtrl.someData;  

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

于 2012-12-26T16:06:23.157 回答
1

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

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

所以,为了回应@MathewBerg 已经说过的话,是的,修改指令/链接函数中的范围。

于 2012-12-26T17:59:23.093 回答