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 Promiseque fue resuelto por el resolvede$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 whenbloque 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, otherwisese 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 $routeChangeErorrse 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.