5

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

  1. 我需要建造一个吗?或者我应该使用$rootScope?
  2. 如果我应该使用$rootScope,如何确保没有事件名称冲突?
  3. $rootScope用于不需要它们传播到子作用域的事件是否有效?
4

2 回答 2

13

我在一个用于平板电脑的 Web 项目中建模并实现了以下机制:

  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值已更改的滑块指令(除了常规的双向绑定),我使用:scope.$emit(Slider.Notification.RangeStartDidChange)scope当前作用域在哪里。
  3. 这种方法在一个小项目中有点冗长。你可能想一直坚持使用$rootScope.$emit(Notification),让所有的听众都去做$rootScope.$on(Notification, callback)接收这些通知。

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

  5. 这些通知的实现(实际值)可能会有所不同。我更喜欢使用strings.

  6. 使用$broadcastor$emit您也可以实际将其他参数传递给侦听器,例如,$broadcast(Notification, arg1, arg2)... Angular的文档非常详细。

于 2013-07-13T13:40:07.777 回答
4

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

  1. 使用$rootScope作为事件聚合器非常好,除非您触发事件超出digest cycle或同时触发多个(100+)事件,而其他一些解决方案可能更合适。
  2. 一种公认的做法是使用命名空间(namespace:event- 使用的模式Backbone.Marionette
  3. $emit在子范围上使用而不是$broadcaston $rootScope-$emit仅向上$broadcast传播,向下传播 - 到所有子级
于 2013-07-13T07:27:43.967 回答