我创建了一个JSFiddle来说明我的情况:http://jsfiddle.net/hLv27/
我有一组指令,它们应该彼此独立,但根据属性(主题)提供的数据进行更新。我可以通过多次使用相同的指令来举例说明这一点:
<my-directive topics="main.topicList"></my-directive>
<my-directive topics="main.staticTopicList"></my-directive>
<my-directive topics="main.topicList" update-on="some.event"></my-directive>
每个指令从服务器获取其数据,具体取决于主题:
在第一种情况下,我会使用$watch
,观察topics
数组,并相应地获取新数据;
$scope.$watch("topics", function (theTopics) {
$scope.fetchData(theTopics);
});
在第二种情况下, 使用固定数组初始化指令,但我没有 需要事后更新;
在第三种情况下,我会添加到每个
指令对应于获得的广播的update-on
字符串
topics
数组更改时触发。
if ($scope.updateOn) {
$scope.$on($scope.updateOn, function (ev, tags) {
$scope.fetchData(tags);
});
}
问题是:使用$watch
或$broadcast
?
附录:是否有更好的方法来创建类似的指令? (例如,无需观看或广播)
答案 0 :(得分:1)
使用$ broadcast会多更多高效。 (实际上,$ emit。)
什么是更好是一个悬而未决的问题。
$ watch不是很聪明 - 它必须做很多工作来确定是否有变化。 (与$ watchCollection相同的故事。)“我们”(AngularJS社区)使用它,因为我们已经决定权衡取舍。在大多数情况下,您不必经常这样做,它非常准确,而且很容易理解。它遵循AngularJS“世界”的几乎所有原则。在完全模块化的世界中,这是解决问题的好方法......通常。
另一方面,当您确定确定时,您的数据已被更改,$ watch只是要求AngularJS转身猜测(好吧,努力计算)同样的事实你已经知道。使用消息广播效率更高 - Angular只需迭代一小部分侦听器。它不必通过深层对象和集合进行任何基于对象/属性的输入或递归。你基本上是在做这项工作。
如果你这样做,请考虑$ emit而不是$ broadcast。在一个真正的pub / sub中,将这些消息“冒泡”到每个范围并没有多大优势,而且成本高昂 - 足以扼杀你刚刚赢得的优势。 $ rootScope。$ emit()会将这些消息保持在一个级别,你可以使用$ rootScope。$ on()来监听它们。这将迭代此事件名称的一小部分侦听器,并且已完成 - 无需额外的工作。
最终,决定什么是“更好”会回到你身边。如果你想要效率,基于消息的模型几乎是完美的选择。如果你想要观察者的优雅,你可能想要一个不同的选择。