2016-09-05 7 views
0

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

ответ

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(); не работает должным образом, а не делает приложение «ждет». – GomuGomuNoRocket

+0

Не могли бы вы создать плукер? Я готов помочь? Проверьте это для рабочего примера http://stackoverflow.com/a/26800804/1679310 и еще несколько ресурсов ... –

+0

Также здесь .. http://stackoverflow.com/a/26135437/1679310. предотвратить по умолчанию, чтобы остановить стандартное поведение JS, а не поток вашего кода. Вы должны использовать возврат, чтобы выйти, если toState - это то, что вы хотите перенаправить. –