Lo que estoy tratando de lograr
Me gustaría hacer la transición a un determinado estado (inicio de sesión) en caso de que una solicitud $ http devuelva un error 401. Por lo tanto, he creado un interceptor $ http.
El problema
Cuando intento insertar '$ state' en el interceptor, obtengo una dependencia circular. ¿Por qué y cómo lo soluciono?
Código
//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);
fuente
$injector
servicio en su interceptor y llama a$injector.get()
donde necesita obtener el$state
servicio.$httpProvider.responseInterceptors.push
ya no funciona si está utilizando versiones posteriores de Angular. Úselo en su$httpProvider.interceptors.push()
lugar. También tendrías que modificar elinterceptor
. De todos modos, ¡gracias por la maravillosa respuesta! :)La pregunta es un duplicado de AngularJS: inyectar servicio en un interceptor HTTP (dependencia circular)
Estoy volviendo a publicar mi respuesta de ese hilo aquí:
Una mejor solución
Creo que usar el inyector $ directamente es un antipatrón.
Una forma de romper la dependencia circular es usar un evento: en lugar de inyectar $ state, inyecte $ rootScope. En lugar de redirigir directamente, haz
más
De esa forma ha separado las preocupaciones:
fuente
La solución de Jonathan fue excelente hasta que intenté guardar el estado actual. En ui-router v0.2.10, el estado actual no parece estar poblado en la carga de página inicial en el interceptor.
De todos modos, lo resolví usando el evento $ stateChangeError en su lugar. El evento $ stateChangeError le da tanto hacia como desde estados, así como el error. Es bastante ingenioso.
fuente