J'ai aimé les réponses ci-dessus et j'ai beaucoup appris d'eux, mais il y a quelque chose qui manque dans la plupart des réponses ci-dessus.
J'étais coincé dans un scénario similaire où je résolvais l'url avec des données récupérées dans la première demande du serveur. Le problème que j'ai rencontré était de savoir si la promesse était rejected
.
Je travaillais avec un fournisseur personnalisé qui permet de revenir un Promise
qui a été résolu par la resolve
de$routeProvider
au moment de la phase de configuration.
Ce que je veux souligner ici, c'est le concept de when
fait quelque chose comme ça.
Il voit l'url dans la barre d'url puis le when
bloc correspondant dans le contrôleur appelé et la vue est référencée jusqu'à présent tout va bien.
Disons que j'ai le code de phase de configuration suivant.
App.when('/', {
templateUrl: '/assets/campaigns/index.html',
controller: 'CampaignListCtr',
resolve : {
Auth : function(){
return AuthServiceProvider.auth('campaign');
}
}
})
// Default route
.otherwise({
redirectTo: '/segments'
});
Sur l'URL racine du navigateur, le premier bloc d'exécution est appelé, sinon il otherwise
est appelé.
Imaginons qu'un scénario que j'ai frappé rootUrl dans la AuthServicePrivider.auth()
fonction de barre d'adresse soit appelé.
Disons que la promesse retournée est en état de rejet quoi alors ???
Rien n'est rendu du tout.
Otherwise
Le bloc ne sera pas exécuté comme pour toute URL non définie dans le bloc de configuration et inconnue de la phase de configuration angularJs.
Nous devrons gérer l'événement qui est renvoyé lorsque cette promesse n'est pas tenue. En cas d'échec se $routeChangeErorr
fait tirer dessus $rootScope
.
Il peut être capturé comme indiqué dans le code ci-dessous.
$rootScope.$on('$routeChangeError', function(event, current, previous, rejection){
// Use params in redirection logic.
// event is the routeChangeEvent
// current is the current url
// previous is the previous url
$location.path($rootScope.rootPath);
});
IMO C'est généralement une bonne idée de mettre le code de suivi des événements dans le bloc d'exécution de l'application. Ce code s'exécute juste après la phase de configuration de l'application.
App.run(['$routeParams', '$rootScope', '$location', function($routeParams, $rootScope, $location){
$rootScope.rootPath = "my custom path";
// Event to listen to all the routeChangeErrors raised
// by the resolve in config part of application
$rootScope.$on('$routeChangeError', function(event, current, previous, rejection){
// I am redirecting to rootPath I have set above.
$location.path($rootScope.rootPath);
});
}]);
De cette façon, nous pouvons gérer l'échec de la promesse au moment de la phase de configuration.