使用服务获取数据的指令:观看还是广播?

时间:2014-07-28 15:04:12

标签: angularjs rest angularjs-directive broadcast watch

我创建了一个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

会更好吗?

附录:是否有更好的方法来创建类似的指令? (例如,无需观看或广播)

1 个答案:

答案 0 :(得分:1)

使用$ broadcast会更多高效。 (实际上,$ emit。)

什么是更好是一个悬而未决的问题。

$ watch不是很聪明 - 它必须做很多工作来确定是否有变化。 (与$ watchCollection相同的故事。)“我们”(AngularJS社区)使用它,因为我们已经决定权衡取舍。在大多数情况下,您不必经常这样做,它非常准确,而且很容易理解。它遵循AngularJS“世界”的几乎所有原则。在完全模块化的世界中,这是解决问题的好方法......通常。

另一方面,当您确定确定时,您的数据已被更改,$ watch只是要求AngularJS转身猜测(好吧,努力计算)同样的事实你已经知道。使用消息广播效率更高 - Angular只需迭代一小部分侦听器。它不必通过深层对象和集合进行任何基于对象/属性的输入或递归。你基本上是在做这项工作。

如果你这样做,请考虑$ emit而不是$ broadcast。在一个真正的pub / sub中,将这些消息“冒泡”到每个范围并没有多大优势,而且成本高昂 - 足以扼杀你刚刚赢得的优势。 $ rootScope。$ emit()会将这些消息保持在一个级别,你可以使用$ rootScope。$ on()来监听它们。这将迭代此事件名称的一小部分侦听器,并且已完成 - 无需额外的工作。

最终,决定什么是“更好”会回到你身边。如果你想要效率,基于消息的模型几乎是完美的选择。如果你想要观察者的优雅,你可能想要一个不同的选择。