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开始说起?
您没有实例化,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)
如果你不想注入服务为控制器,你做的在结合module的run方法
angular.module("mine", ["mine.services"]).run(function(validationService){});
Run Code Online (Sandbox Code Playgroud)