我正在使用angular-js。我有一项服务,每次发生事件时都需要触发事件。为此,我需要一个充当event aggregator
的对象。
$rootScope
? $rootScope
,我怎样才能确保没有事件名称冲突? $rootScope
用于不需要传播到子范围的事件是否有效? 答案 0 :(得分:13)
我在平板电脑的网络项目中建模并实施了以下机制:
在您的服务中定义通知。我不想使用术语事件因为我不希望它与我团队中其他开发人员的 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
值已更改(除了常规双向绑定),我使用:{{ 1}},其中scope.$emit(Slider.Notification.RangeStartDidChange)
是当前范围。这个方法在一个小项目中有点冗长。您可能希望始终坚持使用scope
,并让所有听众$rootScope.$emit(Notification)
接收这些通知。
在某些情况下,您可能希望在集中式服务中定义这些通知,以便更轻松地避免名称冲突。它实际上基于您项目的命名惯例。
这些通知的实施(实际值)可能会有所不同。我更喜欢使用$rootScope.$on(Notification, callback)
。
使用strings
或$broadcast
,您还可以将其他参数传递给侦听器,例如,$emit
... Angular's documentation非常详细。< / p>
答案 1 :(得分:4)
看看http://docs.angularjs.org/api/ng.$rootScope.Scope#$broadcast
。
$rootScope
作为事件聚合器是完全正常的,除非您在某些其他解决方案可能更合适的同时触发事件digest cycle
或触发多个(100+)事件。namespace:event
- Backbone.Marionette
使用的模式)$emit
- $broadcast
上使用$rootScope
代替$emit
,$broadcast
仅向上宣传{{1}}向下宣传 - 向所有儿童传播1} LI>
醇>