1

为了在我的 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开始吗?

4

1 回答 1

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');
        });
    }
]);

如果您不想将服务注入控制器,则在module'srun方法中进行绑定

angular.module("mine", ["mine.services"]).run(function(validationService){});
于 2013-08-01T15:27:25.373 回答