Мне понравились приведенные выше ответы и я многому научился у них, но в большинстве приведенных выше ответов чего-то не хватает.
Я застрял в похожем сценарии, где я решал URL с некоторыми данными, которые выбираются в первом запросе с сервера. Проблема, с которой я столкнулся, заключалась в том, что если обещание будет rejected
.
Я использую пользовательский поставщик , который используется для возврата , Promise
который разрешился resolve
в $routeProvider
то время фазы конфигурации.
Здесь я хочу подчеркнуть, что концепция when
делает что-то вроде этого.
Он видит URL-адрес в строке URL-адреса, а затем соответствующий when
блок в вызываемом контроллере, и просмотр до сих пор считается хорошим.
Допустим, у меня есть следующий код фазы конфигурации.
App.when('/', {
templateUrl: '/assets/campaigns/index.html',
controller: 'CampaignListCtr',
resolve : {
Auth : function(){
return AuthServiceProvider.auth('campaign');
}
}
})
// Default route
.otherwise({
redirectTo: '/segments'
});
По корневому URL в браузере вызывается первый блок запуска, иначе otherwise
вызывается.
Давайте представим сценарий, который я нажал на rootUrl в AuthServicePrivider.auth()
функции адресной строки .
Допустим, обещание вернулось в состоянии отказа, что тогда ???
Ничего не делается вообще.
Otherwise
блок не будет выполняться так, как это делается для любого URL, который не определен в блоке конфигурации и неизвестен на этапе конфигурации angularJs.
Нам придется обработать событие, которое запускается, когда это обещание не выполнено. При неудаче $routeChangeErorr
увольняют $rootScope
.
Это может быть зафиксировано, как показано в коде ниже.
$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 Как правило, рекомендуется помещать код отслеживания событий в блок запуска приложения. Этот код запускается сразу после этапа настройки приложения.
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);
});
}]);
Таким образом, мы можем справиться с ошибкой обещания во время фазы конфигурации.