Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未从我的工厂发出的$rootScope接收事件_Javascript_Angularjs - Fatal编程技术网

Javascript 未从我的工厂发出的$rootScope接收事件

Javascript 未从我的工厂发出的$rootScope接收事件,javascript,angularjs,Javascript,Angularjs,我创建了一个工厂来提供Angular的$exceptionHandler的我自己的实现。 此工厂在$rootScope上发出事件,向侦听器发出发生错误的信号。 我的侦听器是在一个指令中定义的,该指令监视$rootScope.$on事件。只要我的工厂实例截获异常并发出错误事件,一切看起来都很好。但是,假定正在侦听事件的指令从未接收到所述事件。指令中导致侦听器错过此事件的断开连接是什么 澄清:事件处理依赖于完全在$rootscope上发射和消费,以避免在下游广播事件。这是经过设计的,并且以前已经工作

我创建了一个工厂来提供Angular的$exceptionHandler的我自己的实现。 此工厂在$rootScope上发出事件,向侦听器发出发生错误的信号。 我的侦听器是在一个指令中定义的,该指令监视$rootScope.$on事件。只要我的工厂实例截获异常并发出错误事件,一切看起来都很好。但是,假定正在侦听事件的指令从未接收到所述事件。指令中导致侦听器错过此事件的断开连接是什么

澄清:事件处理依赖于完全在$rootscope上发射和消费,以避免在下游广播事件。这是经过设计的,并且以前已经工作过,或者至少在我根据使用相同策略的几个实现编写的httpLoader和httpErrorHandler中工作过

普朗克:

angular.module('demo.services',[]);
angular.module('demo.directives',[]);
模块('demo',['demo.services','demo.directives']);
angular.module('demo')
.controller('demoCtrl',函数($scope){
$scope.message=“生成错误”;
$scope.generateError=函数(){
var x;
x、 foo.oops=':(';
}
});
angular.module('demo.services')
.factory(“$exceptionHandler”,函数(){
var$injector=angular.injector(['ng']);
返回函数errorCatcherHandler(异常,原因){
rootScope=$injector.get(“$rootScope”);
rootScope.$emit(“httpError”,异常);
控制台错误(异常);
};
});
angular.module('demo.directives')
.directive('ngHttpError',['$rootScope',
函数($rootScope){
返回{
范围:{
标题:“@”,
},
模板:“”+
'错误!{{errorModel | json}}'+
'',
链接:功能($scope){
无功功率;
$scope.ror=false;
$scope.errorModel={};
淋浴ROR=$scope.淋浴ROR;
var initScope=函数(e,m){
控制台日志(m);
$scope.errorModel=m;
$scope.showError=true;
}
$rootScope.$on(“httpError”,initScope);
}
};
}
]);
引导(文档,['demo']);
请记住,
$emit()
在作用域层次结构中向上发送事件,
$broadcast()
在层次结构中向下发送事件。由于
$rootScope
是“根”作用域(最顶层/节点),因此在此处使用
$broadcast()
将事件“向下”发送到子作用域是有意义的

$emit()
,来自:

通过作用域层次结构向上分派事件名称,通知已注册的$rootScope.scope侦听器

$broadcast()
,来自:

将事件名称向下分派给所有子作用域(及其子作用域),通知已注册的$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);
    };
});

顺便说一句,这里可以看到一个相关的问题/答案:

只是我不希望将事件广播到子作用域。这包含消息传递策略,完全是为了$rootscope。请参见:顺便问一句:您是否测试了这一问题并确认了它?嗯,我已经尝试了从您的
generateError()进行$broadcasting
function-这在发出时有效(根据我在回答中所写的内容,这是预期的)。现在,我正在试图找出从异常处理程序进行广播不起作用的原因:)让它工作@mccainz-我用一个工作的代码片段更新了我的回答。依赖注入$injector成功了$emit现在可以按预期工作($broadcst与$emit不是最关键的问题)。我想知道的是,使用ng->Injector和$Injector作为依赖项所导致的$rootScopes之间到底有什么区别。非常感谢你的帮助!
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);
    };
});