我正在尝试使用 $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 应该在页面准备就绪时调用,那么为什么要在监听器准备好之前调用它呢?我应该怎么做才能防止这种情况发生?
最佳答案
“页面准备就绪时应调用 ng-init”。这个假设是错误的。查看 ngInitDirective(当前 Angular 为 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
的 Controller 执行 $broadcast
并且监听器在附加到 b
的 Controller 中注册,那么您的广播是甚至在监听器注册之前就已触发。
解决方案:
不要使用 ng-init
。从您的指令中调用 init 函数。从指令 a
的 post-link
函数调用您的广播函数。当 pre-link
从外部指令执行到内部指令时,post-link 反之亦然,因此您的内部 Controller (与监听器)将在外部 Controller 进行广播之前准备就绪。
关于javascript - 在注册听众之前调用 AngularJS ng-init $broadcast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32931355/