一个文件中有多个控制器,$ broadcast / $不工作

时间:2014-04-06 00:51:20

标签: angularjs

我在一个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?我不认为他们是,但我不知道如何控制控制器加载的顺序。这可能吗?

非常感谢你的帮助: - )

3 个答案:

答案 0 :(得分:0)

正在发生的是操作顺序

  • 创建订单控制器
  • broadcast hello
  • 创建行行控制器
  • 创建顶部行控制器

因此在创建其他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

我建议使用服务在控制器之间共享“启动”信息。