Ren*_*aud 25 broadcast event-handling angularjs
在angularJS事件处理的上下文中,我想知道两件事.
在阅读了有关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.