在侦听器注册之前调用AngularJS ng-init $ broadcast

时间:2015-10-04 08:06:40

标签: javascript angularjs

我正在尝试使用$ broadcast

向不确定数量的侦听器广播初始值

我用ng-init调用$ rootScope。$ broadcast。广播在页面加载时正常工作,但监听器未注册。但是,后续调用会被正确选取。

html;

<div class="panel panel-body" ng-controller="Location" ng-init="setActiveLocation({{ defaultLocation }})">

方法;

    $scope.setActiveLocation = function(location) {
        console.log('broadcast:', location);
        $rootScope.$broadcast('setActiveLocation', location);
    };

听众;

       $scope.$on('setActiveLocation', function(event, location)
            {
                console.log('recieved: ', event)
                $scope.clearHistory();
                $scope.refreshHistory(location);
            });

我的问题是这个;当页面准备就绪时应该调用ng-init,那么为什么在侦听器准备好之前调用它?我应该怎么做才能防止这种情况发生?

1 个答案:

答案 0 :(得分:2)

“当页面准备就绪时应该调用ng-init”。这个假设是错误的。查看ngInitDirective(当前角度为1.4.7)。

var ngInitDirective = ngDirective({
  priority: 450,
  compile: function() {
    return {
      pre: function(scope, element, attrs) {
        scope.$eval(attrs.ngInit);
      }
    };
  }
});

它在pre-link阶段执行,与页面状态无关。

所以我猜你的设置是这样的:

<a ng-init="someFunctionInA()">
    <b ng-init="someFunctionInB()"></b>
</a>

如果连接到a的控制器执行$broadcast并且监听器已在附加到b的控制器中注册,则在监听器甚至注册之前会触发您的广播。

解决方案: 不要使用ng-init。从指令中调用init函数。从指令post-link的{​​{1}}功能调用广播功能。虽然a从外部指令到内部指令执行,但后链接反之亦然,因此您的内部控制器(与侦听器)将在外部控制器进行广播之前就绪。

相关问题