Me gustaron las respuestas anteriores y aprendí mucho de ellas, pero hay algo que falta en la mayoría de las respuestas anteriores.
Estaba atrapado en un escenario similar donde estaba resolviendo la URL con algunos datos que se obtienen en la primera solicitud del servidor. El problema que enfrenté fue qué pasa si la promesa es rejected
.
Estaba usando un proveedor personalizado que solía devolver uno Promise
que fue resuelto por el resolve
de$routeProvider
en el momento de la fase de configuración.
Lo que quiero enfatizar aquí es el concepto de when
que hace algo como esto.
Ve la url en la barra de url y luego el when
bloque respectivo en el controlador llamado y la vista se refiere hasta ahora muy bien.
Digamos que tengo el siguiente código de fase de configuración.
App.when('/', {
templateUrl: '/assets/campaigns/index.html',
controller: 'CampaignListCtr',
resolve : {
Auth : function(){
return AuthServiceProvider.auth('campaign');
}
}
})
// Default route
.otherwise({
redirectTo: '/segments'
});
En la URL raíz del navegador, se llama al primer bloque de ejecución; de lo contrario, otherwise
se llama.
Imaginemos que se llama a un escenario en el que golpeé rootUrl en la AuthServicePrivider.auth()
función de barra de direcciones .
Digamos que la promesa devuelta está en estado de rechazo , ¿entonces qué?
Nada se representa en absoluto.
Otherwise
el bloque no se ejecutará como lo es para cualquier url que no esté definida en el bloque de configuración y que sea desconocida para la fase de configuración de angularJs.
Tendremos que manejar el evento que se dispara cuando esta promesa no se resuelve. En caso de fallo $routeChangeErorr
se dispara $rootScope
.
Se puede capturar como se muestra en el código a continuación.
$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);
});
En general, es una buena idea poner el código de seguimiento de eventos en el bloque de ejecución de la aplicación. Este código se ejecuta justo después de la fase de configuración de la aplicación.
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 esta manera podemos manejar el fracaso de la promesa en el momento de la fase de configuración.