我有一个场景,我想在一个 Controller 中发送广播事件并让指令的 Controller 接收消息。事件在 Controller 启动时立即发送,问题是因为指令使用 templateUrl 加载 View ,它是异步发生的,所以事件在指令 Controller 初始化之前广播。如果 View 位于主页面主体中,则不会发生此问题,但我猜 Controller 初始化顺序可能仍然存在问题。
我在我的主 Controller 中使用以下代码:
$rootScope.$broadcast("event:myevent");
我在这里重现了这个问题:http://jsfiddle.net/jugglingcats/7Wf8N .
您可以在 Javascript 控制台中看到主 Controller 在指令的 Controller 之前初始化,并且它从未看到该事件。
所以我的问题是是否有办法等到所有 Controller 都初始化后再广播事件?
非常感谢
最佳答案
我已经创建了一个工作版本。我实际上觉得这是一种非常不干净的方法,但我想不出更好的方法:http://jsfiddle.net/7Wf8N/3/
我所做的是:在指令中我添加了一些代码,这些代码将在初始化时增加 $rootScope 中的计数器。我使用计数器是因为正如您所说,您想等待多个 Controller :
$rootScope.initialized = ( $rootScope.initialized||0 ) +1;
在“RegularCtrl”中,我在此计数器上添加了一个 watch ,如果计数器达到正确的值(一切都已初始化),我将发送事件:
$rootScope.$watch('initialized', function() {
if ( $rootScope.initialized == 1 ) {
$rootScope.$broadcast("event:myevent");
}
});
关于javascript - 使用 templateUrl 的 angularjs 指令 - 初始化序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19058192/