在$exceptionHandler的decorator中使用Angularjs Toaster



我正试图吐司$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依赖项。

最新更新