繁体   English   中英

angularjs指令使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM