我正试图吐司$exceptionHandler装饰器中处理的错误,如下所示,
var app = angular.module('myApp',['toaster']);
app.config(function($provide){
$provide.decorator('$exceptionHandler',function($delegate,toaster){
toaster.pop('error','text','error');
$delegate(exception, cause);
});
});
这是plunkr。这给了我以下错误,
Error: [$injector:cdep] Circular dependency found: $rootScope <- toaster <- $exceptionHandler <- $rootScope
我使用AngularJS Toast来显示错误。现在如何在装饰器中注入烤面包机服务?
您可以将$injector
注入到装饰器中,并将注入封装在函数中。这会延迟toast服务的注入,直到您调用$exceptionHandler
,从而防止循环依赖。
var app = angular.module('myApp',['toaster']);
app.config(function($provide){
$provide.decorator('$exceptionHandler',function($delegate,$injector){
return function (exception, cause) {
var toaster = $injector.get('toaster');
toaster.pop('error','text','error');
}
});
});
要扩展为什么这是一个循环依赖项,您必须了解注入的服务需要什么,以及装饰器中发生了什么。
toaster
服务依赖于$rootScope
,并且正被注入到$exceptionHandler
的decorator中。然而,$rootScope
反过来又依赖于$exceptionHandler
。这最终会创建一个循环引用。
如果注入$http
或$q
而不是toaster
,则会发现相同的行为,因为它们也依赖于$rootScope
。问题不在于toaster
。。。相反,它是$rootScope
依赖项,同时试图将行为应用于$rootScope
的依赖项。