Comment annuler un événement de changement d'itinéraire dans AngularJs?
Mon code actuel est
$rootScope.$on("$routeChangeStart", function (event, next, current) {
// do some validation checks
if(validation checks fails){
console.log("validation failed");
window.history.back(); // Cancel Route Change and stay on current page
}
});
avec ceci même si la validation échoue Angular extrait le modèle suivant et les données associées, puis revient immédiatement à la vue / route précédente. Je ne veux pas qu'angular tire le prochain modèle et les données si la validation échoue, idéalement, il ne devrait pas y avoir de window.history.back (). J'ai même essayé event.preventDefault () mais cela ne sert à rien.
la source
$routeChangeStart
lanext
variable, il ne s'agit que d'une chaîne et qu'elle ne peut contenir aucune donnée (par exemple, vous ne pouvez pas accéder à laauthorizedRoles
variable précédente définie )$location.path()
et$location.search()
Un exemple de code plus complet, utilisant
$locationChangeStart
Je ne suis pas complètement content de le connecter à mon contrôleur racine (contrôleur de niveau supérieur). S'il y a un meilleur modèle, j'aimerais le savoir. Je suis nouveau dans angular :-)
la source
Une solution consiste à diffuser un événement «notAuthorized» et à l'attraper dans la portée principale pour modifier l'emplacement. Je pense que ce n'est pas la meilleure solution, mais cela a fonctionné pour moi:
et dans mon contrôleur principal:
Remarque: il y a une discussion sur ce problème sur le site angular, pas encore résolu: https://github.com/angular/angular.js/pull/4192
ÉDITER:
Pour répondre au commentaire, voici plus d'informations sur les travaux de LoginService. Il contient 3 fonctions:
(*) Ma session est remplie lorsque l'itinéraire change. J'ai remplacé la méthode when () pour peupler la session lorsqu'elle est vide.
Voici le code:
la source
LoginService.isAuthenticated()
au chargement de la première page? Comment stockez-vouscurrentUser
? Que se passe-t-il si l'utilisateur actualise la page (l'utilisateur doit à nouveau saisir les informations d'identification)?Pour quiconque tombe sur cette question est une vieille question, (au moins dans angulaire 1.4), vous pouvez le faire:
la source
C'est ma solution et cela fonctionne pour moi, mais je ne sais pas si je suis sur la bonne voie car je suis novice dans les technologies Web.
la source
j'ai trouvé celui-ci pertinent
mon message peut aider quelqu'un à l'avenir.
la source
la source
Dans le cas où vous devez empêcher la route de changer dans l'
$routeChangeStart
événement (c'est-à-dire que vous voulez effectuer une opération basée sur la route suivante ), injectez$route
et$routeChangeStart
appelez à l' intérieur :la source
$route.reload()
doit être différente, sinon il exécute à nouveau le même code. C'est l'équivalent de créer unewhile
boucle avectrue
comme condition.