Podobały mi się powyższe odpowiedzi i wiele się od nich nauczyłem, ale w większości powyższych odpowiedzi brakuje czegoś.
Utknąłem w podobnym scenariuszu, w którym rozwiązywałem adres URL z danymi, które są pobierane w pierwszym żądaniu z serwera. Problem, z którym się spotkałem, polegał na tym, że jeśli taka jest obietnica rejected
.
I był przy użyciu niestandardowego dostawcy, który używany do zwróci Promise
który został rozwiązany przez resolve
z $routeProvider
w czasie fazy config.
Chciałbym tutaj podkreślić, że koncepcja when
tego robi coś takiego.
Widzi adres URL w pasku adresu URL, a następnie odpowiedni when
blok w nazwie kontrolera, a widok jest do tej pory odsyłany tak dobrze.
Powiedzmy, że mam następujący kod fazy konfiguracji.
App.when('/', {
templateUrl: '/assets/campaigns/index.html',
controller: 'CampaignListCtr',
resolve : {
Auth : function(){
return AuthServiceProvider.auth('campaign');
}
}
})
// Default route
.otherwise({
redirectTo: '/segments'
});
Na adresie URL root w przeglądarce wywoływany otherwise
jest pierwszy blok uruchamiania, w przeciwnym razie wywoływany.
Wyobraźmy sobie scenariusz, w którym uderzyłem rootUrl w AuthServicePrivider.auth()
funkcji paska adresu .
Powiedzmy, że Obietnica zwrócona jest w stanie odrzucenia, co wtedy ???
Nic się nie renderuje.
Otherwise
blok nie zostanie wykonany tak, jak w przypadku dowolnego adresu URL, który nie jest zdefiniowany w bloku konfiguracji i nie jest znany fazie konfiguracji angularJs.
Będziemy musieli poradzić sobie ze zdarzeniem, które zostanie zwolnione, gdy ta obietnica nie zostanie rozwiązana. W przypadku awarii $routeChangeErorr
zostaje zwolniony $rootScope
.
Można go przechwycić, jak pokazano w kodzie poniżej.
$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 Generalnie dobrym pomysłem jest umieszczenie kodu śledzenia zdarzeń w bloku uruchamiania aplikacji. Ten kod jest uruchamiany tuż po fazie konfiguracji aplikacji.
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);
});
}]);
W ten sposób poradzimy sobie z niepowodzeniem obietnicy w fazie konfiguracji.