非常好的问题。
事件处理程序按初始化顺序执行。
以前我没有真正考虑过这个问题,因为我的处理程序从来不需要知道哪一个先运行,但是从你的fiddle看来,处理程序按照它们初始化的顺序调用。
在你的fiddle中,你有一个控制器controllerA
,它依赖于两个服务:ServiceA
和ServiceB
:
myModule
.controller('ControllerA',
[
'$scope',
'$rootScope',
'ServiceA',
'ServiceB',
function($scope, $rootScope, ServiceA, ServiceB) {...}
]
);
服务和控制器都定义了一个事件监听器。
现在,所有依赖项在注入之前都需要解决,这意味着两个服务将在注入到控制器之前进行初始化。因此,服务中定义的处理程序将首先被调用,因为服务工厂在控制器之前初始化。
然后,您可能还会注意到,服务按照它们被注入的顺序进行初始化。所以ServiceA
在ServiceB
之前初始化,因为它们按照这个顺序被注入到控制器中。如果您更改了它们在控制器签名中的顺序,您会发现它们的初始化顺序也会改变(ServiceB
在ServiceA
之前)。
因此,在服务初始化之后,控制器也会被初始化,并且其中定义的事件处理程序也会随之初始化。
因此,最终结果是,在$broadcast时,处理程序将按照此顺序执行:ServiceA
处理程序,ServiceB
处理程序,ControllerA
处理程序。
listenersArray.unshift(listenersArray.splice(-1, 1)[0]);
- JohnLocklistenersArray.unshift(listenersArray.pop());
- p0stm