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

  • 我需要 build 一个吗?还是应该使用$rootScope
  • 如果我应该使用$rootScope,如何确保没有事件名称冲突?
  • $rootScope用于不需要将其传播到子范围的事件是否有效?
  • 最佳答案

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

  • 在您的服务中定义通知。我不想使用术语事件,因为我不希望团队中其他开发人员将其与DOM事件混淆。具有智能感知支持的IDE和调试更易于使用通知的半类型名称。例如,我有一个Device服务,当更改平板电脑设备的方向时,该服务将为$broadcast(Device.Notification.OrientationDidChange)
  • 根据您的需要,使用Scope对象来$broadcast$emit通知。例如,
  • 对于上一个全局通知,我这样做:$rootScope.$broadcast(Device.Notification.OrientationDidChange)。因此,所有监听器都可以在自己的作用域上进行监听,而无需注入(inject)$rootScope
  • 对于可能仅影响当前作用域(及其子作用域)的本地通知,例如某个作用域需要告诉其所有子作用域当前 Controller 的布局已更改的通知,通常我会这样做:scope.$broadcast(UI.Notification.NeedsLayout),其中UI是一个预定义的服务,用于保存与UI相关的常量,而scope是当前作用域。
  • 对于子范围需要向上发送的某些通知,例如,一个滑动指令,它告诉上升范围rangeStart值已更改(除了常规的双向绑定(bind)之外),我使用:scope.$emit(Slider.Notification.RangeStartDidChange),其中scope是当前范围。
  • 在一个小项目中,这种方法有点冗长。您可能想一直坚持使用$rootScope.$emit(Notification),并让所有监听器都执行$rootScope.$on(Notification, callback)来接收这些通知。
  • 在某些情况下,您可能希望在集中式服务中定义这些通知,以便更轻松地避免名称冲突。它确实基于项目的命名约定。
  • 这些通知的实现(实际值)可能有所不同。我更喜欢使用strings
  • 使用$broadcast$emit,您实际上还可以将其他参数传递给监听器,例如$broadcast(Notification, arg1, arg2) ... Angular's documentation非常详细。
  • 关于javascript - $ rootScope作为事件聚合器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17626586/

    10-12 13:09