Was ich versuche zu erreichen
Ich möchte in einen bestimmten Status (Login) wechseln, falls eine $ http-Anfrage einen 401-Fehler zurückgibt. Ich habe daher einen $ http Interceptor erstellt.
Das Problem
Wenn ich versuche, '$ state' in den Interceptor einzufügen, erhalte ich eine zirkuläre Abhängigkeit. Warum und wie behebe ich das?
Code
//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);
quelle
$injector
Dienst in Ihren Interceptor und rufen an,$injector.get()
wo Sie den$state
Dienst benötigen .$httpProvider.responseInterceptors.push
funktioniert nicht mehr, wenn Sie spätere Versionen von Angular verwenden. Verwenden Sie$httpProvider.interceptors.push()
stattdessen. Sie müssten das auch änderninterceptor
. Trotzdem danke für die wundervolle Antwort! :)Die Frage ist ein Duplikat von AngularJS: Injizieren eines Dienstes in einen HTTP-Interceptor (zirkuläre Abhängigkeit)
Ich poste meine Antwort von diesem Thread hier erneut:
Eine bessere Lösung
Ich denke, die direkte Verwendung des $ -Injektors ist ein Antimuster.
Eine Möglichkeit, die zirkuläre Abhängigkeit zu überwinden, besteht darin, ein Ereignis zu verwenden: Anstatt $ state zu injizieren, injizieren Sie $ rootScope. Anstatt direkt umzuleiten, tun Sie dies
Plus
Auf diese Weise haben Sie die Bedenken getrennt:
quelle
Jonathans Lösung war großartig, bis ich versuchte, den aktuellen Zustand zu retten. In ui-router v0.2.10 scheint der aktuelle Status beim ersten Laden der Seite im Interceptor nicht ausgefüllt zu sein.
Wie auch immer, ich habe es gelöst, indem ich stattdessen das Ereignis $ stateChangeError verwendet habe. Die $ stateChangeError Veranstaltung gibt Ihnen sowohl zu und von Staaten sowie den Fehler. Es ist ziemlich geschickt.
quelle