Использование Angularjs-Toaster внутри декоратора $exceptionHandler

Я пытаюсь выявить ошибки, которые обрабатываются в декораторе $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 для отображения ошибок. Как теперь я могу внедрить сервис тостера в декоратор?


person JPS    schedule 28.10.2015    source источник
comment
Привет, у меня такая же проблема, ты нашел какое-то решение?   -  person Amila    schedule 02.12.2015
comment
@DRB, вы должны отметить ответ Дэвида как правильный   -  person Brian Ogden    schedule 17.08.2016


Ответы (1)


Вы можете внедрить $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 и внедряется в декоратор for for $exceptionHandler. Однако $rootScope, в свою очередь, зависит от $exceptionHandler. Это приводит к созданию циклической ссылки.

Вы обнаружите такое же поведение, если $http или $q будут введены вместо toaster, поскольку они также имеют зависимости от $rootScope. проблема не в toaster... а в зависимости $rootScope при попытке также применить поведение к зависимости от $rootScope.

person David L    schedule 14.12.2015
comment
не могли бы вы объяснить, почему существует циклическая ссылка? - person Brian Ogden; 17.08.2016
comment
спасибо, что нашли время, отличное объяснение - person Brian Ogden; 17.08.2016