[英]Not receiving event from $rootScope emitted by my factory
我创建了一个工厂来提供自己的Angular $ exceptionHandler实现 。 该工厂在$ rootScope上发出一个事件,以通知侦听器已发生错误。 我的监听器在指令中定义,该指令正在监视$ rootScope。$ on事件。 就我的工厂实例拦截异常并发出错误事件而言,一切似乎都很好。 但是,假定正在监听事件的指令从不接收该事件。 什么是导致此事件在指令中的侦听器丢失的断开连接?
澄清:事件完全依赖于$ rootscope的发射和消耗,以避免向下游广播事件。 这是设计使然,以前已经起作用,或者至少看起来可以在我基于使用相同策略的多个实现编写的httpLoader和httpErrorHandler中工作。 http://plnkr.co/edit/N0JwYJdxPLur4xYZTUP1?p=info
柱塞: http ://plnkr.co/edit/LDbRa0Ew255fOd0EunAq?p=preview
angular.module('demo.services',[]);
angular.module('demo.directives',[]);
angular.module('demo',['demo.services','demo.directives']);
angular.module('demo')
.controller('demoCtrl', function($scope){
$scope.message="Generate Error";
$scope.generateError =function(){
var x;
x.foo.oops = ':(';
}
});
angular.module('demo.services')
.factory('$exceptionHandler', function () {
var $injector = angular.injector(['ng']);
return function errorCatcherHandler(exception, cause) {
rootScope = $injector.get('$rootScope');
rootScope.$emit("httpError",exception);
console.error(exception);
};
});
angular.module('demo.directives')
.directive('ngHttpError', ['$rootScope',
function ($rootScope) {
return {
scope: {
title: '@',
},
template: '<div ng-click="showError=false"' +
'ng-show="showError">'+
'ERROR! {{errorModel | json}}' +
'</div>',
link: function ($scope) {
var showError;
$scope.showError = false;
$scope.errorModel = {};
showError = $scope.showError;
var initScope = function(e,m){
console.log(m);
$scope.errorModel = m;
$scope.showError=true;
}
$rootScope.$on("httpError", initScope);
}
};
}
]);
angular.bootstrap(document,['demo']);
请记住, $emit()
在范围层次结构中向上发送事件,而$broadcast()
在层次结构中向下发送事件。 由于$rootScope
是“根”作用域(最高级别/节点),因此在此处使用$broadcast()
将事件“向下”发送到子作用域是有意义的。
$emit()
,来自docs :
通过作用域层次结构向上调度事件名称,通知已注册的$ rootScope.Scope侦听器。
$broadcast()
,来自docs :
向所有子范围(及其子范围)向下分配事件名称,通知已注册的$ rootScope.Scope侦听器。
-更新:
我已经更新了您的$exceptionHandler
以获取注入$injector
服务并执行$broadcast()
而不是$emit()
-这似乎可以解决问题:
angular.module('demo.services')
.factory('$exceptionHandler', function ($injector) {
//var $injector = angular.injector(['ng']);
return function errorCatcherHandler(exception, cause) {
rootScope = $injector.get('$rootScope');
rootScope.$broadcast("httpError",exception.message);
console.error(exception);
};
});
顺便说一句,一个相关的问题/答案可以在这里看到: AngularJs / .provider /如何获取rootScope进行广播?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.