AngularJS UI маршрутизация $ stateChangeStart не работает должным образом

0

Я создал приложение с угловыми маршрутами и состояниями. Также у меня есть контроллер 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, я снова пойду в эту функцию, но на этот раз я знаю, в каком состоянии его отправить.

Теги:
angular-ui-router
angular-ui
state

1 ответ

0

Я бы посоветовал, во-первых, всегда проверять, куда текущее изменение переходит на... и выйти, если оно уже перенаправлено

$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');
            ...
  • 0
    да, это хорошая идея но проблема в том, что event.preventDefault (); не работает, как ожидалось, и не заставляет приложение «ждать».
  • 0
    Не могли бы вы создать какой-нибудь поршень? Я готов помочь? Проверьте это для рабочего примера stackoverflow.com/a/26800804/1679310 и некоторых других ресурсов ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню