Mi sono piaciute le risposte sopra e ho imparato molto da loro, ma manca qualcosa nella maggior parte delle risposte di cui sopra.
Ero bloccato in uno scenario simile in cui stavo risolvendo l'URL con alcuni dati recuperati nella prima richiesta dal server. Il problema che ho affrontato è stato se la promessa fosse rejected.
Stavo usando un provider personalizzato che era solito restituire un Promiseche era stato risolto da resolveof $routeProvideral momento della configurazione.
Quello che voglio sottolineare qui è il concetto whenche fa qualcosa del genere.
Vede l'URL nella barra dell'URL e quindi il rispettivo whenblocco nel controller chiamato e la vista è riferita finora così bene.
Diciamo che ho il seguente codice di fase di configurazione.
App.when('/', {
templateUrl: '/assets/campaigns/index.html',
controller: 'CampaignListCtr',
resolve : {
Auth : function(){
return AuthServiceProvider.auth('campaign');
}
}
})
// Default route
.otherwise({
redirectTo: '/segments'
});
Sull'URL di root nel browser otherwiseviene chiamato il primo blocco di esecuzione, altrimenti viene chiamato.
Immaginiamo che AuthServicePrivider.auth()venga chiamato uno scenario che ho colpito rootUrl nella funzione della barra degli indirizzi .
Diciamo che la promessa restituita è nello stato di rifiuto che cosa ???
Nulla viene reso affatto.
Otherwise il blocco non verrà eseguito come per qualsiasi URL che non è definito nel blocco di configurazione ed è sconosciuto alla fase di configurazione di angularJs.
Dovremo gestire l'evento che viene generato quando questa promessa non viene risolta. In caso di fallimento $routeChangeErorrviene attivato $rootScope.
Può essere catturato come mostrato nel codice seguente.
$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 In genere è una buona idea inserire il codice di monitoraggio degli eventi nel blocco di esecuzione dell'applicazione. Questo codice viene eseguito subito dopo la fase di configurazione dell'applicazione.
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);
});
}]);
In questo modo possiamo gestire il fallimento promettente al momento della fase di configurazione.