Co próbuję osiągnąć
Chciałbym przejść do określonego stanu (logowania) na wypadek, gdyby żądanie $ http zwróciło błąd 401. Dlatego utworzyłem przechwytywacz $ http.
Problem
Kiedy próbuję wstawić „stan $” do przechwytywacza, otrzymuję zależność cykliczną. Dlaczego i jak to naprawić?
Kod
//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);
źródło
$injector
usługę do przechwytywacza i dzwonisz$injector.get()
tam, gdzie potrzebujesz$state
usługi.$httpProvider.responseInterceptors.push
nie działają już, jeśli używasz nowszych wersji Angulara. Użyj$httpProvider.interceptors.push()
zamiast tego. Musiałbyś również zmodyfikowaćinterceptor
. W każdym razie dzięki za wspaniałą odpowiedź! :)Pytanie jest duplikatem AngularJS: wstrzykiwanie usługi do przechwytywacza HTTP (zależność cykliczna)
Ponownie zamieszczam odpowiedź z tego wątku tutaj:
Lepsze rozwiązanie
Myślę, że użycie wtryskiwacza $ bezpośrednio jest przeciwieństwem.
Sposobem na przerwanie zależności cyklicznej jest użycie zdarzenia: zamiast wstrzykiwać $ state, wstrzyknij $ rootScope. Zamiast przekierowywać bezpośrednio, zrób
plus
W ten sposób rozdzieliliście obawy:
źródło
Rozwiązanie Jonathana było świetne, dopóki nie spróbowałem zapisać obecnego stanu. W ui-router v0.2.10 wydaje się, że bieżący stan nie jest zapełniany przy początkowym ładowaniu strony w module przechwytującym.
W każdym razie rozwiązałem to, używając zamiast tego zdarzenia $ stateChangeError . $ StateChangeError wydarzenie daje zarówno do i z państw, jak również błędu. To całkiem fajne.
źródło