为什么提供程序中的事件不$emit到$rootScope

Why do events from provider not $emit to $rootScope?

本文关键字:emit rootScope 事件 程序 为什么      更新时间:2023-09-26

为了在我的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');
        });
    }
]);

$on('request:validate')从未从$rootScope发射。$rootScope是否不接收从子作用域发出的事件?$rootScope监听事件的方式有什么奇怪之处吗?

有没有一种"更有角度"的方法?控制器是否应该直接调用validationService?事件$broadcast应该从$rootScope开始吗?

您没有实例化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');
        });
    }
]);

如果您不想将服务注入控制器,可以在modulerun方法中进行绑定

angular.module("mine", ["mine.services"]).run(function(validationService){});