4

Вопрос:

Как я могу использовать $mdToast внутри перехватчика, не вызывая ошибку?

Установка:

определение Interceptor:

(function() { 
    'use strict'; 

    angular 
    .module('app.components.http-errors-interceptors') 
    .factory('HttpError500Interceptor', HttpError500Interceptor); 

    /* @ngInject */ 
    function HttpError500Interceptor($q, 
            $mdToast, 
            $filter) { 

    var interceptor   = {}; 
    interceptor.responseError = responseError; 

    function responseError(responseError) { 
     if (responseError.status === 500) { 
     $mdToast.show($mdToast.simple() 
           .content($filter('translate')('APP.COMPONENTS.HTTP_ERRORS_INTERCEPTORS.500')) 
           .position('bottom right') 
           .hideDelay(5000)); 
     } 
     return $q.reject(responseError); 
    } 

    return interceptor; 
    } 
})(); 

перехватчик конфигурации:

(function() { 
    'use strict'; 

    angular 
    .module('app.components.http-errors-interceptors') 
    .config(moduleConfig); 

    /* @ngInject */ 
    function moduleConfig($httpProvider) { 
    $httpProvider.interceptors.push('HttpError500Interceptor'); 
    } 
})(); 

Выпуск:

Когда я загрузить приложение это вызывает следующее сообщение об ошибке:

Uncaught Error: [$injector:cdep] Circular dependency found: $http <- $templateRequest <- $$animateQueue <- $animate <- $$interimElement <- $mdToast <- HttpError500Interceptor <- $http <- $templateFactory <- $view <- $state

+0

у вас есть исправление? –

+0

@KumarSambhav Да, я смог обходить это, см. Мой ответ ниже, чтобы соответствовать вашему конкретному случаю использования. – diosney

ответ

3

Ни из предоставленных решений работал для меня, поэтому я размещаю здесь то, что я сделал, чтобы любой, у кого с той же проблемой, мог использовать ряд обходных решений.

То, что я действительно хотел, чтобы иметь общий компонент для обработки HTTP-перехватчиков с именем interceptors и показать сообщения непосредственно из модуля, и к счастью, так как окончательное решение изящнее, это вызвало эту ошибку при нагнетании $mdToast службы.

Решение я пришел позже, что я уже сказал, это более элегантно, что мой первый фикс в вопрос:

  • иметь общий компонент для обработки HTTP-перехватчиков с именем interceptors,
  • иметь общий компонент для обработки глобальных уведомлений с именем notifications-hub.

Затем в interceptors модуле, я вызвать глобальное событие с:

$rootScope.$broadcast('notifications:httpError', responseError);

Затем в notifications-hub модуле, я зарегистрирован на мероприятии и использовали $mdToast, который впрыскивается без ошибки в службе уведомлений:

$rootScope.$on('notifications:httpError', function (event, responseError) { NotificationsHubService.processErrorsAndShowToast(responseError); });

NotificationsHubService - услуга, впрыскивающая $mdToast.

Вывод:

Я использовал глобальное событие, как клей между перехватчиками низкого уровня и подсистемой уведомлений, чтобы преодолеть эту проблему.

Надеюсь, он будет полезен для кого-либо еще.

+1

Это действительно кажется гораздо более правильным и изящным решением в соответствии с принципами единой ответственности. –

2

Одна работа вокруг, которая помогла мне в прошлом, чтобы использовать $injector, чтобы получить зависимость во время выполнения, а не во время настройки. Так, что-то вроде:

/* @ngInject */ 
    function HttpError500Interceptor($q, 
            $injector, 
            $filter) { 
    function responseError(responseError) { 
     var $mdToast = $injector.get('$mdToast'); 

Когда циклическая зависимость не вызывает проблем, которые, вероятно, не в этом случае, это будет делать трюк.

+0

Извините, я уже пробовал, что без использования, эта же ошибка срабатывает. Любые другие мысли? Это сводит меня с ума. – diosney

+0

Mmm. Я не могу это объяснить. Это должно нарушить цепочку зависимостей. Вы уверены, что это такая же ошибка? –

+0

Да: '' 'Uncaught Error: [$ injector: cdep] Найдена круговая зависимость: $ http <- $ templateRequest <- $$ animateQueue <- $ animate <- $$ interimElement <- $ mdToast <- HttpError500Interceptor <- $ http <- $ templateFactory <- $ view <- $ state''' – diosney

0

Что вы должны сделать, это создать функцию, которая приносит вам тостер во время выполнения

var getToaster =()=>{ 

    var toaster = $injector.get('$mdToaster'); 
    return toaster; 
} 

Теперь называем это только тогда, когда вам это нужно - это обеспечит работу по всему зависимости циркулярной не

+0

Это не сработало, см. Предыдущие комментарии. Это ошибка краевого случая, найденная в версии recents. См. Https://github.com/angular/material/issues/6946 – diosney

Смежные вопросы