我正在使用 angular-js。我有一项服务,每次发生某事时都需要触发事件。为此,我需要一个充当event aggregator
.
- 我需要建造一个吗?或者我应该使用
$rootScope
? - 如果我应该使用
$rootScope
,如何确保没有事件名称冲突? $rootScope
用于不需要它们传播到子作用域的事件是否有效?
我正在使用 angular-js。我有一项服务,每次发生某事时都需要触发事件。为此,我需要一个充当event aggregator
.
$rootScope
? $rootScope
,如何确保没有事件名称冲突? $rootScope
用于不需要它们传播到子作用域的事件是否有效?我在一个用于平板电脑的 Web 项目中建模并实现了以下机制:
在您的服务中定义通知。我不想使用术语事件,因为我不希望团队中的其他开发人员将它与DOM 事件混淆。对于具有智能感知支持的 IDE 和调试来说,通知的半类型名称更容易。例如,我有一项Device
服务可以$broadcast(Device.Notification.OrientationDidChange)
在平板设备的方向发生变化时使用。
根据您的需要使用Scope
对象$broadcast
或$emit
通知。例如,
$rootScope.$broadcast(Device.Notification.OrientationDidChange)
,我这样做: . 所以所有的监听器都可以在自己的范围内监听而无需注入$rootScope
.scope.$broadcast(UI.Notification.NeedsLayout)
会这样做UI
:服务来保存 UI 相关的常量,并且scope
是当前范围。rangeStart
值已更改的滑块指令(除了常规的双向绑定),我使用:scope.$emit(Slider.Notification.RangeStartDidChange)
,scope
当前作用域在哪里。这种方法在一个小项目中有点冗长。你可能想一直坚持使用$rootScope.$emit(Notification)
,让所有的听众都去做$rootScope.$on(Notification, callback)
接收这些通知。
在某些情况下,您可能希望在集中式服务中定义这些通知,以便更轻松地避免名称冲突。它实际上基于您项目的命名约定。
这些通知的实现(实际值)可能会有所不同。我更喜欢使用strings
.
使用$broadcast
or$emit
您也可以实际将其他参数传递给侦听器,例如,$broadcast(Notification, arg1, arg2)
... Angular的文档非常详细。
看看http://docs.angularjs.org/api/ng.$rootScope.Scope#$broadcast
。
$rootScope
作为事件聚合器非常好,除非您触发事件超出digest cycle
或同时触发多个(100+)事件,而其他一些解决方案可能更合适。namespace:event
- 使用的模式Backbone.Marionette
)$emit
在子范围上使用而不是$broadcast
on $rootScope
-$emit
仅向上$broadcast
传播,向下传播 - 到所有子级