Comment faire pour rediriger dans un ui-router-il de résoudre?
Je suis en train de rediriger l'intérieur d'une interface de routeur résoudre et je voulais savoir si il existe un moyen de rediriger dans un routeur de résolution. Actuellement, cela ne fonctionne pas comme on pourrait le penser.
resolver(auth, $state){
if(!auth.isLoggedIn()){
$state.go('noLoggedInPath');
}
}
Comment rediriger dans un résolveur correctement ?
Mon temp hack est cela, mais je ne suis pas à l'aise avec elle.
resolver(auth, $state, $timeout){
if(!auth.isLoggedIn()){
$timeout(function () {
$state.go('noLoggedInPath');
}, 0);
}
}
- Je ne suis pas sûr à propos de la redirection à l'intérieur d'un programme de résolution, mais si ce que vous voulez, c'est de vérifier si l'utilisateur est connecté ou non, peut-être vous pouvez utiliser le
$stateChangeStart
événement à la place. - La raison d'utiliser le journal de vérifier dans la résolution de sorte que nous n'avons pas de préciser dans statechange l'url de ne pas vérifier.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez revenir à une promesse de votre
resolver
fonction qui indique si à poursuivre la navigation de l'état ou non. Si vous décidez de naviguer d'ailleurs de rejeter la promesse et de spécifier le bon état:Plunkr ici.
UPD: mise à jour du code et a ajouté plunkr. Ressemble, il ne fonctionne que si vous le mettez à l'intérieur d'un délai d'attente de la fonction.
$timeout
var deferred = $q.defer(); if (true) { $timeout(function() { $state.go('error'); deferred.reject(); }); } else { deferred.resolve(); } return deferred.promise;
Yauheni réponse fonctionne, mais pour l'obtenir autour de l'étrange délai chose, vous pouvez le rejeter la promesse, et les captures que dans le $stateChangeError événement, et de faire de votre rediriger là. Comme si...
Et puis ui-router toujours des émissions de "stateChangeError", de sorte que vous pouvez faire quelque chose comme ça..
resolver
doit uniquement être utilisée pour résoudre ou de rejeter des dépendances.{redirectTo: state}
objet que dit le gestionnaire d'erreur exactement l'état à atteindre. Ainsi, le gestionnaire d'erreurs de logique qui dépend de la page que vous essayez de visite, exactement comme vous le décrivez. Si vous avez besoin d'encore plus, comme dire... vous voulez passer un message personnalisé, alors je dirais juste en passant que dans de trop, comme{redirectTo: state, message: customMessage}
, et votre gestionnaire d'erreur peut régler ce problème. L'infrastructure est flexible. Ou je ne suis pas la compréhension de votre problème?- Je utiliser ce
C'est ce que j'ai réellement faire, et je ne peux pas trouver une meilleure solution
Je pense que beaucoup plus propre réponse est à renvoyer un déjà rejeté la promesse de la sorte:
JS:
$state.go
puis retourner le refus de la promesse$q.reject()
. Merci pour les infos supplémentaires!Vous pouvez utiliser le solveur de promesses de avec le redirectTo configuration
À l'aide résout pour cela n'a pas tout à fait pour moi. J'ai adapté la logique de ce post pour exécuter une fonction de redirection sur le données propriété de l'état de l'objet. Ensuite, vous pouvez puiser dans l' $stateChangeStart événement sur $rootScope de l'exécution du bloc du module et de l'utilisation de l'injecteur du service appeler la méthode pour le changement de l'état sur la base des conditions que vous spécifiez. Fonctionne très bien, à travers les modules.