Использование 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);
  });
});

Вот этот планкр. Это дает мне следующую ошибку,

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

Я использую AngularJS-Toaster для отображения ошибок. Как я могу ввести тостер внутри декоратора?

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 и вводится в декоратор для $exceptionHandler, Тем не мение, $rootScope в свою очередь, зависит от $exceptionHandler, В итоге создается круговая ссылка.

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

Другие вопросы по тегам