我正在尝试使用$ 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,那么为什么在侦听器准备好之前调用它?我应该怎么做才能防止这种情况发生?
答案 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
从外部指令到内部指令执行,但后链接反之亦然,因此您的内部控制器(与侦听器)将在外部控制器进行广播之前就绪。