Я создал приложение с угловыми маршрутами и состояниями. Также у меня есть контроллер WEB API, который может использовать, чтобы узнать, аутентифицирован ли пользователь или нет. Проблема в том, что HTTP-запрос к этому WEB API имеет некоторую задержку для возврата результата, потому что он асинхронен.
Я хочу, каждый раз, когда пользователь хочет перейти в состояние, проверить, является ли он аутентифицированным или нет, и дать ему доступ или перенаправить на страницу входа. Но в первый раз, когда приложение работает с каким-то образом, я хочу подождать, пока у меня не будет ответа от моего WEB API.
У меня есть эта часть кода
PlatformWeb.run(function ($rootScope, $state, $timeout, Authorization) {
$rootScope.$state = $state;
$rootScope.User = {
isAuthenticated: null,
targetState: null
}
Authorization.isAuthenticated().then(function (result) {
$rootScope.User.isAuthenticated = result;
$state.go($rootScope.User.targetState.name);
})
hasAccess = function () {
return $rootScope.User.isAuthenticated;
}
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
$rootScope.User.targetState = toState;
if ($rootScope.User.isAuthenticated == null)
event.preventDefault();
else {
if (!hasAccess()) {
event.preventDefault();
$state.go('PlatformWeb.Login');
}
}
});});
В первый раз, когда приложение запускается, $ rootScope.User.isAuthenticated имеет значение null, поэтому я не буду загружать состояние. Также с моей службой "Авторизация" я вызываю свою асинхронную функцию, чтобы получить, если пользователь аутентифицирован или нет. Прежде чем я заблокирую загрузку, я буду держать, когда пользователь захочет, поэтому, когда у меня есть результат от WEP API, я изменяю состояние $ state.go($ rootScope.User.targetState.name); к государству, которого он хочет. Тогда я знаю, если аутентифицирован или нет, и я спрашиваю, есть ли разрешения для перехода. Если у него нет, я перенаправляю его в состояние входа.
BUT event.preventDefault();
не работает должным образом. Когда я запускаю свое приложение, я получаю эту ошибку "angular.min.js: 6 Неиспользуемая ошибка: [$ rootScope: infdig] http://errors.angularjs.org/1.3.7/ $ rootScope/infdig? P0 = 10 & p1 =% 5B% 5D 'несколько раз. Угловая документация говорит: '10 $ digest() итераций достигнуты. Aborting! Наблюдатели выстрелили в последние 5 итераций: [] '
В моей логике функция stateChangeStart в состоянии "$ rootScope.User.isAuthenticated == null" с event.preventDefault(); будет делать журналы приложений здесь, а не запускать больше, пока я не узнаю. Когда я верну свой результат из своего WEBAPI, я снова пойду в эту функцию, но на этот раз я знаю, в каком состоянии его отправить.
Я бы посоветовал, во-первых, всегда проверять, куда текущее изменение переходит на... и выйти, если оно уже перенаправлено
$rootScope.$on('$stateChangeStart',
function (event, toState, toParams, fromState, fromParams) {
// are we already going to redirection target?
if(toState.name === 'PlatformWeb.Login'){
return; // yes, so do not execute the rest again...
}
$rootScope.User.targetState = toState;
if ($rootScope.User.isAuthenticated == null)
event.preventDefault();
else {
if (!hasAccess()) {
event.preventDefault();
// we will redirect here only if not already on that way...
$state.go('PlatformWeb.Login');
...