Чего я пытаюсь достичь
Я хотел бы перейти в определенное состояние (логин), если запрос $ http возвращает ошибку 401. Поэтому я создал перехватчик $ http.
Эта проблема
Когда я пытаюсь вставить "$ state" в перехватчик, я получаю круговую зависимость. Почему и как мне это исправить?
Код
//Inside Config function
var interceptor = ['$location', '$q', '$state', function($location, $q, $state) {
function success(response) {
return response;
}
function error(response) {
if(response.status === 401) {
$state.transitionTo('public.login');
return $q.reject(response);
}
else {
return $q.reject(response);
}
}
return function(promise) {
return promise.then(success, error);
}
}];
$httpProvider.responseInterceptors.push(interceptor);
источник
$injector
службу в свой перехватчик и вызываете,$injector.get()
где вам нужно получить$state
службу.$httpProvider.responseInterceptors.push
больше не работают, если вы используете более поздние версии Angular.$httpProvider.interceptors.push()
Вместо этого используйте . Вам также придется изменитьinterceptor
. В любом случае спасибо за чудесный ответ! :)Вопрос - дубликат AngularJS: Внедрение службы в перехватчик HTTP (круговая зависимость)
Я повторно отправляю свой ответ из этой ветки здесь:
Лучшее исправление
Я думаю, что использование инжектора $ напрямую - это антипаттерн.
Способ разорвать круговую зависимость - использовать событие: вместо добавления $ state введите $ rootScope. Вместо прямого перенаправления сделайте
плюс
Таким образом вы разделили проблемы:
источник
Решение Джонатана было отличным, пока я не попытался сохранить текущее состояние. В ui-router v0.2.10 текущее состояние не отображается при загрузке начальной страницы в перехватчике.
В любом случае я решил это, используя вместо этого событие $ stateChangeError . $ StateChangeError событие дает вам как к и от государств, а также ошибок. Это довольно здорово.
источник