2015-10-04 58 views
0

我试图广播初始值听众数量不确定的有$广播

我打电话$ rootScope。$用NG-INIT播出。广播在页面加载中正常工作,但听众没有注册。然而,接下来的电话会被正确接收。

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,那么为什么在listeners准备好之前调用它呢?我应该怎么做才能防止这种情况?

+0

您应该考虑将调用setActiveLocation移动到控制器。把它放在ng-init中是将逻辑的一部分放在html中,而没有什么好处。 [ng-init文档](https://docs.angularjs.org/api/ng/directive/ngInit)说:“该指令可能会被滥用,从而将不必要的逻辑添加到您的模板中......” –

+0

它在控制器中....再次检查html,除非我不明白你的意思? – user3737396

+0

我只是指:ng-init =“setActiveLocation({{defaultLocation}})”。如果您在控制器中调用了setActiveLocation,则可以确保侦听器之前已经设置好。 顺便说一句:它应该可能是setActiveLocation(defaultLocation)而不是setActiveLocation({{defaultLocation}}),如果你想保留在ng-init中。 –

回答

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阶段执行,并已与othing页面状态的状态做。

,所以我想您的设置是这样的:

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

如果连接到a控制器是否$broadcast和听众在连接到b控制器注册,那么你的广播听众之前解雇甚至已经注册。

解决方案: 请勿使用ng-init。从你的指令调用init函数。通过指令apost-link功能拨打广播功能。虽然pre-link从外部指令执行到内部指令,但后部链接反之亦然,因此您的内部控制器(与听众)将在外部控制器进行广播之前做好准备。