Ce que j'essaye d'accomplir
Je voudrais passer à un certain état (connexion) au cas où une requête $ http renvoie une erreur 401. J'ai donc créé un intercepteur $ http.
Le problème
Lorsque j'essaye d'insérer «$ state» dans l'intercepteur, j'obtiens une dépendance circulaire. Pourquoi et comment résoudre ce problème?
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);
la source
$injector
service dans votre intercepteur et appelez$injector.get()
là où vous devez obtenir le$state
service.$httpProvider.responseInterceptors.push
ne fonctionne plus si vous utilisez des versions ultérieures d'Angular. Utilisez$httpProvider.interceptors.push()
plutôt. Vous devrez également modifier leinterceptor
fichier. Quoi qu'il en soit, merci pour la merveilleuse réponse! :)La question est un double de AngularJS: service d'injection dans un intercepteur HTTP (dépendance circulaire)
Je publie à nouveau ma réponse à partir de ce fil ici:
Une meilleure solution
Je pense que l'utilisation directe de $ injector est un anti-modèle.
Un moyen de rompre la dépendance circulaire est d'utiliser un événement: au lieu d'injecter $ state, injectez $ rootScope. Au lieu de rediriger directement, faites
plus
De cette façon, vous avez séparé les préoccupations:
la source
La solution de Jonathan était excellente jusqu'à ce que j'essaye de sauver l'état actuel. Dans ui-router v0.2.10, l'état actuel ne semble pas être renseigné lors du chargement initial de la page dans l'intercepteur.
Quoi qu'il en soit, je l'ai résolu en utilisant l' événement $ stateChangeError à la place. Le stateChangeError $ si vous donne à la fois à et d' états, ainsi que l'erreur. C'est assez chouette.
la source