AngularJS ng-init $broadcast在监听器注册之前调用
AngularJS ng-init $broadcast called before listeners registered
我正在尝试使用$broadcast
向不确定数量的侦听器广播初始值我正在调用$rootScope。$broadcast with 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应该在页面准备好时调用,那么为什么要在侦听器准备好之前调用它呢?我应该做些什么来预防这种情况?"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
的控制器执行$broadcast
,并且在连接到b
的控制器中注册了侦听器,那么在侦听器注册之前就会触发广播。
解决方案:不要使用ng-init
。从你的指令中调用init函数。从指令a
的post-link
函数调用广播函数。当pre-link
从外部到内部指令执行时,post-link反之亦然,因此您的内部控制器(带有侦听器)将在外部控制器执行广播之前准备好。
相关文章:
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 如何从Java/scala调用js美化程序
- Node.js同步调用passport本地注册
- 如何在Ajax调用的元素上注册mouserover
- 聚合物元素注册和生命周期(创建和准备调用两次)
- 在页面加载(包括 AJAX 调用)时调用的 JavaScript 函数的注册表
- 迁移到 VS2013.4 后调用 WinRT 强制要求时未注册类异常
- AngularJS ng-init $broadcast在监听器注册之前调用
- 调用ScriptManager.从ASP.net中注册startpscript
- 使用ajax调用注册用户
- 如何用api调用来构建React App的所有登录、注册和主页
- Q promise:都是按注册顺序调用的回调函数
- 调用过程注册在javascript从python服务器Autobahn, Wamp
- 如何注册一个onclick事件,以便它知道从哪个对象调用它
- .hasClass.在第二次. Click之前不注册函数调用.ajax异步
- 在GWT java代码中注册javascript方法,以便可以根据GWT中的事件调用该方法
- 使用setTimeout注册的函数何时调用
- 注册Firebase Listener而不调用它
- 套接字可以注册未调用的监听器