3

我试图敬酒那些在 $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-Toaster来显示错误。现在如何在装饰器中注入烤面包机服务?

4

1 回答 1

8

您可以将其$injector注入您的装饰器并将您的注入包装在一个函数中。这会延迟 toaster 服务的注入,直到您调用$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并被注入到 for 的装饰器中$exceptionHandler。但是,$rootScope反过来又依赖于$exceptionHandler. 这最终创建了一个循环引用。

如果$http$q被注入而不是注入,您会发现相同的行为,toaster因为它们也依赖于$rootScope. 这并不是具体的问题......toaster而是$rootScope在尝试将行为也应用于. $rootScope

于 2015-12-14T04:39:13.557 回答