Мой вопрос аналогичен, так что этот: остановка углового-ui-router навигации до тех пор, пока обещание не будет разрешено
Тем не менее, ни один из ответов, похоже, не решает эту проблему.
В моем приложении хранится файл cookie с токеном. Когда страница загружается (например, после F5), приложение проверяет файл cookie, и если он найден, он использует токен для загрузки пользовательских настроек, которые загружаются из веб-службы. Эти настройки необходимы для получения всей другой информации из других веб-служб, которые вызовут мои контроллеры, поэтому параметры должны быть загружены до того, как страница может отобразиться.
Это мой текущий код:
$rootScope.$on( '$stateChangeStart', function(e, toState, toParams, fromState, fromParams) {
e.preventDefault();
authentication.checkCookie(function() {
if (toState.name == 'login'){
if(authentication.getLoginData()) {
//e.preventDefault();
$state.go('pricelist');
}
} else {
if(!authentication.getLoginData()) {
//e.preventDefault();
$state.go('login');
}
}
// No redirect is needed - now render the page requested
$urlRouter.sync();
});
});
К сожалению, этот код не работает: он просто вызывает бесконечный цикл.
Как я могу убедиться, что рендеринг продолжается только после проверки файла cookie и загрузки пользовательских настроек (это также делается в checkCookie)?
Мне удалось решить эту проблему, используя другой ответ в упомянутой ссылке:
$rootScope.$on( '$stateChangeStart', function(e, toState, toParams, fromState, fromParams) {
if ($rootScope.stateChangeBypass) {
$rootScope.stateChangeBypass = false;
return;
}
e.preventDefault();
authentication.checkCookie(function() {
$rootScope.stateChangeBypass = true;
if (toState.name == 'login'){
if(authentication.getLoginData()) {
$state.go('pricelist');
} else {
$state.go(toState, toParams);
}
} else {
if(!authentication.getLoginData()) {
$state.go('login');
} else {
$state.go(toState, toParams);
}
}
});
});
Это не очень чистое решение, но оно работает.