在$ exceptionHandler的装饰器中使用Angularjs-Toaster

时间:2015-10-28 06:50:00

标签: angularjs angularjs-decorator angularjs-config

我正试图在$ 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);
  });
});

Here是傻瓜。 这给了我以下错误,

Error: [$injector:cdep] Circular dependency found: $rootScope <- toaster <- $exceptionHandler <- $rootScope

我正在使用AngularJS-Toaster来显示错误。我现在如何在装饰器内注入烤面包机服务?

1 个答案:

答案 0 :(得分:8)

您可以将$injector注入装饰器并将注射包装在一个函数中。这会延迟注入烤面包机服务,直到您调用$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的装饰器中。但是,$rootScope依赖于$exceptionHandler。这最终会创建一个循环引用。

如果注入$http$q而不是toaster,您会发现相同的行为,因为它们也依赖于$rootScope。它不是toaster特别是问题...而是尝试将行为应用于依赖 $rootScope依赖性> $rootScope