gpt4 book ai didi

javascript - $rootScope 作为事件聚合器

转载 作者:数据小太阳 更新时间:2023-10-29 05:43:26 25 4
gpt4 key购买 nike

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

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

最佳答案

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

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

  2. 使用 Scope 对象来$broadcast$emit notifications,具体取决于您的需要。例如,

    • 对于像前一个那样的全局通知,我这样做:$rootScope.$broadcast(Device.Notification.OrientationDidChange)。所以所有的监听器都可以在他们自己的范围内监听,而无需注入(inject) $rootScope
    • 对于可能只影响当前范围(及其子范围)的本地通知,例如范围需要告诉其所有子范围的通知当前 Controller 的布局发生变化,通常我这样做:scope.$broadcast(UI.Notification.NeedsLayout),其中 UI 是一个预定义的服务,用于保存与 UI 相关的常量, scope 是当前范围。
    • 对于子作用域需要向上发送的某些通知,例如,告诉上升作用域 rangeStart 值已更改的 slider 指令(除了常规双向绑定(bind)之外),我使用: scope.$emit(Slider.Notification.RangeStartDidChange),其中 scope 是当前范围。
  3. 这种方法在小项目中有点冗长。您可能希望始终坚持使用 $rootScope.$emit(Notification),并让所有监听器执行 $rootScope.$on(Notification, callback) 以接收这些通知。

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

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

  6. 使用 $broadcast$emit 您实际上还可以将其他参数传递给监听器,例如,$broadcast(Notification, arg1, arg2)... Angular's documentation很详细。

关于javascript - $rootScope 作为事件聚合器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17626586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com