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 Promise
che era stato risolto da resolve
of $routeProvider
al momento della configurazione.
Quello che voglio sottolineare qui è il concetto when
che fa qualcosa del genere.
Vede l'URL nella barra dell'URL e quindi il rispettivo when
blocco 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 otherwise
viene 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 $routeChangeErorr
viene 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.