Ui-Router $ state.go dans $ on ('$ stateChangeStart') provoque une boucle infinie
Je suis en train d'introduire de connexion dans la façon dont l'utilisateur navigue à travers l'application.
Je fais semblant de rediriger l'utilisateur vers la page où il était avant qu'il accédez à la page de connexion si la page répond à des exigences spécifiques
La prévention de l'événement à partir de l' $stateChangeStart arrêt de la modification de l'état comme prévu, mais quand je lance l' $état.aller('into_somewhere') - je entrer une infinit boucle
Mon angulaire de la version 1.3.1 et l'interface utilisateur du routeur est la dernière
.factory('RouteHistory', function ($rootScope,$log, $state, Auth, $urlRouter, $timeout) {
//after the user enter a page
var currentState = '';
//when the user is trying to access a page that he has not permissions
//or that requires the user to be logged in
var pendingState = '';
var isMenuTogglerVisible = false;
var skipFromStateVal = true;
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
event.preventDefault();
if (toState.name == 'login' && fromState.name != 'login'){
$log.log('Ui-router: changing to login');
//$urlRouter.sync();
$state.go('login')
//pendingState = fromState;
//$log.log('Peding state updated to:' + pendingState.name );
//$urlRouter.sync();
}
if (fromState.name == 'login' && Auth.isLoggedIn()) {
$log.log('Ui-router: going from login');
//$state.go(fromState.name);
$timeout(function(){
//$state.go('home', null, {/*reload: true, location: 'replace'*/});
$state.go('browse-machine');
//$urlRouter.sync();
},2000)
}
$log.log({
'toState': toState,
'toParams': toParams,
'fromState': fromState,
'fromParams': fromParams
})
})
return {
};
});
source d'informationauteur Lothre1 | 2014-11-07
Vous devez vous connecter pour publier un commentaire.
En général, je dirais, nous allons rediriger (
$state.go()
) seulement en cas de besoin. Dans d'autres cas, de sortir de l'écouteur d'événement:C'est simplifiée logique, mais montre, que l'on devrait changer à l'exécution que si nécessaire. Il y a quelques autres examles plus détaillée de la mise en œuvre et plunkers:
Comme prévu dans le commentaire, il n'y a plunkerj'ai changé comme ça ici
Et c'est pas boucle plus. S'il vous plaît, vérifier ici
Cette réponse m'a aidé:
Original:
Pourquoi ne AngularJS avec ui-router continuer à tirer le $stateChangeStart événement?
Vous devez utiliser l'option de notification :
Cela permettra d'éviter stateChangeStart à feu nouveau.
J'ai simplement utilisé
$location.path('every/where')
au lieu de$state.go('every/where')
🙂 .
La boucle infinie est en partie causée par
..qui dit
if
vous allez l'état de connexion,then
aller à l'état de connexion....Et l'appel
event.preventDefault()
la première ligne dans le gestionnaire d'événement n'aide pas. Lorsque vous utilisezgo()
pour aller à l'écran de login (ou ailleurs), ce changement d'état est aussi empêché parevent.preventDefault()
. Il doit être utilisé uniquement à l'intérieur d'unif
.$StateChangeStart gestionnaire devrait plutôt être...
...qui se lit naturellement. "
If
vous ne l'êtes pas et que vous n'êtes pas déjà en cours à l'écran de connexion,then
arrêtez ce que vous faites, je vais vous souvenez-vous où vous voulez aller, et maintenant, vous allez à l'écran de connexion."Plus tard, votre
Auth
objet émet un$state.go(Auth.desiredState)
quand il est satisfait de l'utilisateur.Cela fonctionne pour moi, le code ci-Dessous permet de se débarrasser de boucle infinie