3

我有一个场景,我想在一个控制器中发送一个广播事件,并让一个指令的控制器接收消息。该事件在控制器启动时立即发送,问题是由于指令使用 templateUrl 加载视图,它异步发生,因此在指令控制器初始化之前广播事件。如果视图位于主页正文中,则不会发生此问题,但我想控制器初始化顺序可能仍然存在问题。

我在我的主控制器中使用以下代码:

$rootScope.$broadcast("event:myevent");

我在这里重现了这个问题:http: //jsfiddle.net/jugglingcats/7Wf8N

您可以在 Javascript 控制台中看到主控制器在指令控制器之前初始化,并且它永远不会看到该事件。

所以我的问题是是否有办法等到所有控制器都初始化后再广播事件?

非常感谢

4

2 回答 2

1

你是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,您可以设置一个变量并使用数据绑定到您的指令。

于 2013-09-27T21:31:25.190 回答
1

我创建了一个工作版本。我实际上觉得这是一种非常不干净的方法,但我想不出更好的方法: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");        
    }
});
于 2013-09-27T20:23:19.920 回答