Я создал приложение с угловыми ui-маршрутами и состояниями. Также у меня есть контроллер 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 имеет нулевое значение, поэтому я помешаю загружать состояние. Также с моей службой «Авторизация» я вызываю свою асинхронную функцию, чтобы получить, если пользователь аутентифицирован или нет. Прежде чем я заблокирую загрузку, я буду держать, когда пользователь захочет, поэтому, когда у меня есть результат от 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, я снова пойду в эту функцию, но на этот раз я знаю, в каком состоянии его отправить.
да, это хорошая идея. но проблема в том, что event.preventDefault(); не работает должным образом, а не делает приложение «ждет». – GomuGomuNoRocket
Не могли бы вы создать плукер? Я готов помочь? Проверьте это для рабочего примера http://stackoverflow.com/a/26800804/1679310 и еще несколько ресурсов ... –
Также здесь .. http://stackoverflow.com/a/26135437/1679310. предотвратить по умолчанию, чтобы остановить стандартное поведение JS, а не поток вашего кода. Вы должны использовать возврат, чтобы выйти, если toState - это то, что вы хотите перенаправить. –