为什么 rootscope.on 没有被触发?

Why is rootscope.on not triggered?

我在 ListController 中使用 $scope.$emit 来触发 MainController 中的 $rootScope.$on 事件(angular 1.3):

(function () {
    'use strict';

    angular
        .module('mymodule.faultlist')
        .controller('MainController', ['$rootScope', function ($rootScope) {
            $rootScope.$on('newViewLoaded', function (event, metadata) {
                $rootScope.metadata = metadata;
                console.log('hello metacontroller metadata', metadata);
            });

        }])
        .controller('ListController', ['faultlistservice', 'faultListConstants', '$scope', '$timeout', '$rootScope',
            function (faultlistservice, faultListConstants, $scope, $timeout, $rootScope) {

                $timeout(function () {
                    $scope.$emit('newViewLoaded', {
                        'title': faultListConstants.meta.title,
                        'description': faultListConstants.meta.description
                    });
                }, 100);

            }]);
})();

这就是 index.html 的大致样子:

.
.
<head ng-controller="MainController">
<div class="container main-content" ui-view >
</div>
..

这不会被触发。我尝试将 $rootScope.$on 块移动到 ListController,然后 $rootScope.$on 被触发。为什么这不适用于 MainController 或者是否有更好的实现方法?

你的代码有效http://plnkr.co/edit/hsl3l6rTJd1SUDgaijCy?p=preview

我认为你的问题可能在于你的 ng-app 不在 html 标签上,所以 <head ng-controller="MainController"> 这一行在 ngApp 之外。

您的代码可以正常工作http://plnkr.co/edit/nX9KVqY0SZ46Yvf92VAk?p=preview

plunkr 展示了如何使用此示例来处理您的原始代码。这里的标题和描述是要在 emit 函数内部传递的参数,不能是字符串文字

 $scope.$emit('newViewLoaded', {
                        'title': faultListConstants.meta.title,
                        'description': faultListConstants.meta.description
                    })