Ich mochte die obigen Antworten und habe viel von ihnen gelernt, aber in den meisten der obigen Antworten fehlt etwas.
Ich steckte in einem ähnlichen Szenario fest, in dem ich die URL mit einigen Daten auflöste, die in der ersten Anforderung vom Server abgerufen wurden. Das Problem, mit dem ich konfrontiert war, war, was ist, wenn das Versprechen ist rejected
.
Ich war mit einem benutzerdefinierten Anbieter , die ein benutzten zurückzukehren , Promise
die durch die aufgelöste wurden resolve
von $routeProvider
zum Zeitpunkt der Konfigurationsphase.
Was ich hier hervorheben möchte, ist das Konzept, dass when
es so etwas tut.
Es sieht die URL in der URL-Leiste und dann den entsprechenden when
Block im aufgerufenen Controller und die Ansicht wird bisher so gut verwiesen.
Nehmen wir an, ich habe folgenden Konfigurationsphasencode.
App.when('/', {
templateUrl: '/assets/campaigns/index.html',
controller: 'CampaignListCtr',
resolve : {
Auth : function(){
return AuthServiceProvider.auth('campaign');
}
}
})
// Default route
.otherwise({
redirectTo: '/segments'
});
Bei der Root-URL im Browser wird der erste Block des Laufs aufgerufen, andernfalls otherwise
wird er aufgerufen.
Stellen wir uns ein Szenario vor, in dem ich rootUrl in der Adressleistenfunktion drücke AuthServicePrivider.auth()
.
Sagen wir Versprechen zurück in wird ablehnen Zustand , was dann ???
Es wird überhaupt nichts gerendert.
Otherwise
Der Block wird nicht ausgeführt, wie dies für eine URL der Fall ist, die nicht im Konfigurationsblock definiert ist und der Konfigurationsphase von angleJs unbekannt ist.
Wir müssen das Ereignis behandeln, das ausgelöst wird, wenn dieses Versprechen nicht gelöst wird. Bei einem Fehler $routeChangeErorr
wird ausgelöst $rootScope
.
Es kann wie im folgenden Code gezeigt erfasst werden.
$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 Es ist im Allgemeinen eine gute Idee, den Ereignisverfolgungscode in den Ausführungsblock der Anwendung einzufügen. Dieser Code wird unmittelbar nach der Konfigurationsphase der Anwendung ausgeführt.
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);
});
}]);
Auf diese Weise können wir Versprechensfehler zum Zeitpunkt der Konfigurationsphase behandeln.