Мне понравились приведенные выше ответы, и я многому от них научился, но в большинстве из приведенных выше ответов чего-то не хватает.
Я застрял в аналогичном сценарии, когда я разрешал 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);
});
}]);
Таким образом, мы можем справиться с ошибкой обещания на этапе настройки.
person
Ashish Singh
schedule
12.01.2015