$ rootScope作为事件聚合器

时间:2013-07-13 03:07:16

标签: javascript angularjs angularjs-scope

我正在使用angular-js。我有一项服务,每次发生事件时都需要触发事件。为此,我需要一个充当event aggregator的对象。

  1. 我需要建一个吗?或者我应该使用$rootScope
  2. 如果我应该使用$rootScope,我怎样才能确保没有事件名称冲突?
  3. $rootScope用于不需要传播到子范围的事件是否有效?

2 个答案:

答案 0 :(得分:13)

我在平板电脑的网络项目中建模并实施了以下机制:

  1. 在您的服务中定义通知。我不想使用术语事件因为我不希望它与我团队中其他开发人员的 DOM事件混淆。对于具有智能感知支持和调试的IDE,通知的半类型名称更容易。例如,我有一项Device服务,当平板电脑设备的方向发生变化时会$broadcast(Device.Notification.OrientationDidChange)

  2. 根据您的需要,将Scope个对象用于$broadcast$emit 通知。例如,

    • 对于与上一个通知类似的全局通知,我执行:$rootScope.$broadcast(Device.Notification.OrientationDidChange)。因此,所有听众都可以在不注入$rootScope的情况下聆听自己的范围。
    • 对于本地通知,可能只影响当前范围(及其子级),例如通知,范围需要告知其所有子范围我更改了当前控制器的布局:scope.$broadcast(UI.Notification.NeedsLayout),其中UI是用于保存UI相关常量的预定义服务,scope是当前作用域。
    • 对于子范围需要向上发送的某些通知,例如,滑块指令告诉上升范围rangeStart值已更改(除了常规双向绑定),我使用:{{ 1}},其中scope.$emit(Slider.Notification.RangeStartDidChange)是当前范围。
  3. 这个方法在一个小项目中有点冗长。您可能希望始终坚持使用scope,并让所有听众$rootScope.$emit(Notification)接收这些通知。

  4. 在某些情况下,您可能希望在集中式服务中定义这些通知,以便更轻松地避免名称冲突。它实际上基于您项目的命名惯例。

  5. 这些通知的实施(实际值)可能会有所不同。我更喜欢使用$rootScope.$on(Notification, callback)

  6. 使用strings$broadcast,您还可以将其他参数传递给侦听器,例如,$emit ... Angular's documentation非常详细。< / p>

答案 1 :(得分:4)

看看http://docs.angularjs.org/api/ng.$rootScope.Scope#$broadcast

  1. 使用$rootScope作为事件聚合器是完全正常的,除非您在某些其他解决方案可能更合适的同时触发事件digest cycle或触发多个(100+)事件。
  2. 一种公认的做法是使用命名空间(namespace:event - Backbone.Marionette使用的模式)
  3. $emit - $broadcast上使用$rootScope代替$emit$broadcast仅向上宣传{{1}}向下宣传 - 向所有儿童传播