AngularJS / forçant la propriété de résolution à exécuter à tout moment

Comme la plupart des développeurs angulaires le savent, la propriété Resolve permet de protéger l'accès à certaines pages.

Voici un bref exemple de code d'extrait:

.config(['$routeProvider', 'securityAuthorizationProvider', function ($routeProvider, securityAuthorizationProvider) { $routeProvider.when('/test', { templateUrl: '/myCorrespondingView.tpl.html', controller: 'MyCorrespondingCtrl', resolve: securityAuthorizationProvider.requireAuthenticatedUser }); }]) 

Supposons une page contenant un lien intitulé " Cliquez ici pour accéder à la page protégée " (en faisant un $location.path("/test") sous le capot).

Les attentes sont les suivantes: lorsque je clique dessus, resolve comme rejected et … ne redirigez pas vers d'autres pages que la page de l'appelant.

Cela provoque … rien (le simple fait que l'utilisateur ne puisse pas accéder à la page suffit) mais l'URL a changé pour la page protégée ciblée. => myApp.com/test (pourquoi Angular ne fait pas ce remplacement uniquement en cas de résultat de promesse réussie ?? :(, mais c'est une autre question que je viens de demander: AngularJS / Modification de l'URL uniquement lorsque le modèle correspondant La propriété de résolution est résolue ).

Ensuite … cliquez à nouveau …

Il semble que la resolve ne soit toujours pas traitée.

Ensuite … cliquez sur un autre lien sur l'application (sans redirection intégrale bien sûr), selon votre souhait afin de modifier l'URL, et réinitialiser sur le lien protégé => Resolve serait bien traité à nouveau.

Existe-t-il un mécanisme angulaire qui vérifie l'URL de la page actuelle et l'URL de la page souhaitée, et évite de traiter la tâche de resolve si les deux sont les mêmes?

Je souhaite vraiment forcer le processus de resolve même si l'URL correspond déjà à la page cible.

** MISE À JOUR ******** À partir de cette publication: https://stackoverflow.com/a/12429133/985949

Montres angulaires pour un changement d'emplacement (qu'il soit accompli en tapant dans la barre de localisation, en cliquant sur un lien ou en définissant l'emplacement via $ location.path ()). Quand il détecte ce changement , il diffuse un événement, "$ locationChangeSuccess", et commence le processus de routage.

Il semble que le chèque que j'ai supposé ci-dessus est en fait effectué par la méthode $location.path … Ce serait génial si l'on peut forcer l'évaluation.

Les itinéraires angulaires répondent aux changements dans l'URL, et non aux clics. Si l'emplacement ne change pas dans le navigateur angulaire, ne le reprendra pas du tout.

Il semble que ce que vous devriez faire, c'est créer un service qui écoute "$ locationChangeSuccess" et conserve la trace de la dernière route réussie. Ensuite, avez un autre auditeur sur $ routeChangeError qui réinitialise l'emplacement à la dernière route réussie lors d'une panne. Cela vous empêcherait de rester dans un état incohérent où l'emplacement ne correspond pas à votre itinéraire actif actuel.

Une fois que vous l'avez fait, cliquer sur le lien à nouveau entraînerait le navigateur à tenter de modifier l'emplacement à nouveau, ce qui déclenchera de nouveau vos résolutions.

J'ai trouvé cette publication confirmant la solution de @dtabuenc juste au-dessus. Voici la mienne:

 angular.module('services.locationChanger', []) .service('locationChanger', ['$location', '$route', '$rootScope', function ($location, $route, $rootScope) { this.skipReload = function () { var lastRoute = $route.current; $rootScope.$on('$locationChangeSuccess', function () { $route.current = lastRoute; }); return this; }; this.withoutRefresh = function (url, doesReplace) { if(doesReplace){ $location.path(url).replace(); } else { $location.path(url || '/'); } }; }]); 

Et tout appelant dans la partie du processus de resolve serait:

 locationChanger.skipReload().withoutRefresh("/", true); 

Fonctionne comme un charme.