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