Gostei das respostas acima e aprendi muito com elas, mas há algo que está faltando na maioria das respostas acima.
Eu estava preso em um cenário semelhante em que estava resolvendo o URL com alguns dados que foram buscados na primeira solicitação do servidor. O problema que enfrentei foi o que aconteceria se a promessa fosse rejected
.
Eu estava usando um provedor personalizado que usou para retornar um Promise
que foi resolvido pelo resolve
de $routeProvider
, no momento da fase de configuração.
O que quero enfatizar aqui é o conceito de when
que faz algo assim.
Ele vê o URL na barra de URL e, em seguida, o respectivo when
bloco no chamado controlador e a exibição é referida até agora como boa.
Digamos que eu tenho o seguinte código de fase de configuração.
App.when('/', {
templateUrl: '/assets/campaigns/index.html',
controller: 'CampaignListCtr',
resolve : {
Auth : function(){
return AuthServiceProvider.auth('campaign');
}
}
})
// Default route
.otherwise({
redirectTo: '/segments'
});
No URL raiz do navegador, o primeiro bloco de execução é chamado, caso contrário, otherwise
é chamado.
Vamos imaginar que um cenário em que eu carregue no rootUrl na AuthServicePrivider.auth()
função da barra de endereço seja chamado.
Vamos dizer que a promessa retornada está em estado de rejeição o que então ???
Nada é renderizado.
Otherwise
O bloco não será executado como é para qualquer URL que não esteja definido no bloco de configuração e seja desconhecido na fase de configuração do angularJs.
Teremos que lidar com o evento que é acionado quando essa promessa não for resolvida. Em caso de falha $routeChangeErorr
é acionado $rootScope
.
Pode ser capturado como mostrado no código abaixo.
$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 Geralmente, é uma boa ideia colocar o código de rastreamento de eventos no bloco de aplicativos em execução. Este código é executado logo após a fase de configuração do aplicativo.
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);
});
}]);
Dessa forma, podemos lidar com falhas prometidas no momento da fase de configuração.