我在一个controller.js文件中有这样的代码。在模板中,我有一组嵌套的div。嵌套如下:ng-controller =“OrderController”...,ng-controller =“LineRowController”...,ng-controller =“ToppingRowController”......
这是controller.js中的代码......
angular.module('AJM.OrderController', [])
.controller('LineRowController', ['$scope', function ($scope) {
$scope.$on('hello', function () {
console.log('heard hello!');
});
}])
.controller('ToppingRowController', ['$scope', function ($scope) {
$scope.$on('hello', function () {
console.log('heard hello!');
});
}])
.controller('OrderController', ['$scope', '$rootScope', function ($scope, $rootScope) {
console.log('Say hello...')
$rootScope.$broadcast('hello');
}]);
附加说明:在加载某些订单数据后,在OrderController中的$ resource回调中调用真正的$ broadcast。因此,在广播该消息之前会有一点延迟。
在控制台中,我看到“打招呼......”,但从未见过“听过你好!”。
我错过了什么?如何确定$ on挂钩设置为听到$ broadcast?我不认为他们是,但我不知道如何控制控制器加载的顺序。这可能吗?
非常感谢你的帮助: - )
答案 0 :(得分:0)
正在发生的是操作顺序
因此在创建其他2个控制器之前广播该事件。
请参阅此fiddle
中的控制台console.log in the creation of each controller
正如所解释的那样,您编写的用于广播和收听事件的代码是正确的,这只是时间问题。通常,$ broadcast是基于用户操作完成的,时间不是问题。
答案 1 :(得分:0)
如果不进行测试,我认为您的前两个控制器首先被解雇。
试试这个:
修改强>
<div ng-app="AJM.OrderController" ng-view>
<div ng-controller="OrderController">
<div ng-controller="LineRowController">
<div ng-controller="ToppingRowController"></div>
</div>
</div>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script>
<script>
angular.module('AJM.OrderController', [])
.controller('LineRowController', ['$scope', function ($scope) {
$scope.$on('hello', function () {
console.log('heard hello!');
});
}])
.controller('ToppingRowController', ['$scope', '$rootScope', function ($scope, $rootScope) {
console.log('Say hello...')
$rootScope.$broadcast('hello');
}])
.controller('OrderController', ['$scope', '$rootScope', function ($scope, $rootScope) {
$scope.$on('hello', function () {
console.log('heard hello!');
});
}]);
</script>
</div>
答案 2 :(得分:0)
正在广播的控制器在其他两个人有机会订阅该事件之前被实例化。
也许尝试类似这样的事情(虽然这是一个非常糟糕的解决方法,使超时假装等待其余的控制器实例化)。
(编辑使用服务而不是超时):
http://plnkr.co/edit/dT0OXYYW03mHB08JNToV?p=preview
我建议使用服务在控制器之间共享“启动”信息。