angularJS $ on事件处理程序触发顺序

Ren*_*aud 25 broadcast event-handling angularjs

在angularJS事件处理的上下文中,我想知道两件事.

  1. 如何定义触发同一事件的处理程序的触发顺序?
  2. 如果你开始想知道这是否是一个糟糕的设计的迹象?

在阅读了有关angular $ on,$ broadcast和$ emit以及本机DOM事件流的文档后,我想我理解事件处理程序将在不同的范围内触发.问题是当多个处理程序从不同的位置(例如,控制器与服务)监听相同的范围(例如$ rootScope)时.

为了说明这个问题,我将一个jsfiddle与一个控制器和两个服务放在一起,所有这些都通过$ rootScope http://jsfiddle.net/Z84tX/进行通信

Thanks

Ste*_*wie 26

非常好的问题.

事件处理程序按初始化顺序执行.

我以前没有真正考虑过这个问题,因为我的处理程序从来不需要知道哪一个先运行,但是通过你的外观,我可以看到处理程序的调用顺序与初始化顺序相同.

在你的小提琴你有一个控制器controllerA,它依赖于两个服务,ServiceA并且ServiceB:

myModule
  .controller('ControllerA', 
    [
      '$scope', 
      '$rootScope', 
      'ServiceA', 
      'ServiceB', 
      function($scope, $rootScope, ServiceA, ServiceB) {...}
    ]
  );
Run Code Online (Sandbox Code Playgroud)

服务和控制器都定义了一个事件监听器.

现在,所有依赖项都需要在注入之前解析,这意味着两个服务都会在注入控制器之前进行初始化.因此,将首先调用服务中定义的处理程序,因为服务工厂在控制器之前初始化.

然后,您可能还会观察到服务是按照注入的顺序进行初始化的.所以ServiceA之前进行了初始化,ServiceB因为它们按顺序注入控制器.如果您在控制器签名中更改了他们的订单,您将看到他们的启动顺序也已更改(ServiceB之前ServiceA).

因此,在初始化服务之后,控制器也会被初始化,并且随之在其中定义事件处理程序.

因此,最终结果是,在$ broadcast上,处理程序将按以下顺序执行:ServiceAhandler,ServiceBhandler,ControllerAhandler.