![](/img/trans.png)
[英]AngularJS: Using $compile on html that contains directives with templateurl
[英]angularjs directives using templateUrl - initialisation sequence
我有一个场景,我想在一个控制器中发送广播事件,并让指令的控制器接收消息。 事件在控制器启动时立即发送,问题在于因为指令正在使用templateUrl加载视图,所以它是异步发生的,因此在指令控制器初始化之前广播事件。 如果视图位于主页面主体中,则不会发生此问题,但我想控制器初始化顺序仍然存在问题。
我在主控制器中使用以下代码:
$rootScope.$broadcast("event:myevent");
我在这里转载了这个问题: http : //jsfiddle.net/jugglingcats/7Wf8N 。
您可以在Javascript控制台中看到主控制器在指令的控制器之前初始化,并且它永远不会看到该事件。
所以我的问题是,是否有一种方法可以等到所有控制器在广播事件之前被初始化?
非常感谢
我创建了一个工作版本。 我实际上觉得这是一种非常不干净的方式,但我无法想出更好的东西: http : //jsfiddle.net/7Wf8N/3/
我做的是这样的:在指令中我添加了一些代码,它们会在初始化时增加$ rootScope中的计数器。 我使用计数器,因为正如你所说,你想要等待多个控制器:
$rootScope.initialized = ( $rootScope.initialized||0 ) +1;
在“RegularCtrl”中,我在此计数器上添加了一个监视器,如果计数器达到正确的值(一切都已初始化),我发送事件:
$rootScope.$watch('initialized', function() {
if ( $rootScope.initialized == 1 ) {
$rootScope.$broadcast("event:myevent");
}
});
你在ng-view
吗? 如果是这样,您可以使用$viewContentLoaded
事件。 这将在所有dom加载后触发。
http://docs.angularjs.org/api/ngRoute.directive:ngView
function MyCtrl($scope, $rootScope) {
$scope.$on('$viewContentLoaded', function() {
$rootScope.$broadcast('event:myevent');
});
}
如果您不使用ng-view
,则可以设置变量并使用数据绑定到您的指令。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.