为什么来自提供者的事件不是$发射到$ rootScope?

fou*_*ama 1 javascript angularjs

为了在我的AngularJS应用程序中保持解耦,我有一个validationService不同的控制器可以调用来执行验证.实际上,validate()给定控制器中的方法应该只是$emit一个事件(request:validate例如)服务将侦听的事件 - 但它似乎没有$rootScope接收到发出的事件.例如:

angular.module('mine').controller('CommitController', [
    '$scope',
    function($scope) {
        $scope.validate = function() {
            $scope.$emit('request:validate');
        };
    }
]);
angular.module('mine.services').factory('validationService', [
    '$rootScope',
    function($rootScope) {
        $rootScope.$on('request:validate', function(e) {
            console.log('received the request:validate event - go ahead with validation');
        });
    }
]);
Run Code Online (Sandbox Code Playgroud)

$on('request:validate')永远不会发火$rootScope.难道$rootScope没有收到子作用域发出的事件?如何$rootScope倾听事件是否有些怪癖?

对此有一种"更有角度"的方法吗?控制器应该直接打电话validationService吗?如果该事件$broadcast$rootScope开始说起?

Umu*_*acı 6

您没有实例化,validationService因此侦听器不会附加.将其包含在模块中并将其注入控制器.

angular.module('mine',["mine.services"]).controller('CommitController', [
    '$scope', "validationService",
    function($scope, vs) {
        $scope.validate = function() {
            $scope.$emit('request:validate');
        };
    }
]);
angular.module('mine.services',[]).factory('validationService', [
    '$rootScope',
    function($rootScope) {
        $rootScope.$on('request:validate', function(e) {
            console.log('received the request:validate event -'+
                         'go ahead with validation');
        });
    }
]);
Run Code Online (Sandbox Code Playgroud)

如果你不想注入服务为控制器,你做的在结合modulerun方法

angular.module("mine", ["mine.services"]).run(function(validationService){});
Run Code Online (Sandbox Code Playgroud)