2015-10-20 3 views
2

Я получаю бесконечный цикл для этого кода:Угловая щ-маршрутизатор бесконечный цикл, когда urlRouteProvider.otherwise установлен

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { 
     var isLoggedIn = (authService.authentication && authService.authentication.isAuth); 
     if (isLoggedIn) { 
      //if user is logged and tries to access login page, prevent it 
      if (toState.name === 'app.login') { 
       event.preventDefault(); 
       return fromState; 
      } 
     } else { 
      if (toState.name !== 'app.login') { 
       event.preventDefault(); 
       $state.go('app.login'); 
       return; 
      } 
     } 
    }); 

У меня также есть этот набор:

function config($stateProvider, $urlRouterProvider, $ocLazyLoadProvider) { 
    $urlRouterProvider.otherwise('/main'); 

    $stateProvider 
    .state('app', { 
     abstract: true, 
     url: '', 
     controller: 'mainCtrl', 
     controllerAs: 'mainCtrl', 
     template:'<div ui-view></div>'  
    }) 
    .state('app.login', { 
     url: '/logn' 
     controller: 'loginCtrl', 
     controllerAs: 'loginCtrl', 
     templateUrl: 'app/security/login.html' 
    }) 
    .state('app.main', { 
     url: '/main' 
     controller: 'mainCtrl', 
     controllerAs: 'mainCtrl', 
     templateUrl: 'app/main.html' 
    }) 
    ... 
} 

Теперь я получение бесконечного цикла дайджеста, когда пользователь входит на сайт и должен быть аутентифицирован. Это выглядит следующим образом:

  1. Пользователь вводит адрес, а именно: http://localhost
  2. маршрут по умолчанию (иначе) пожаров и reddirects пользователю http://localhost/#/main
  3. $ OnStateChangeStart пожаров (для app.main) и протестировать, если пользователь вошел в систему, если нет, то запретить перенаправление по умолчанию в конец события «app.login ';
  4. $ OnstateChangeStart пожаров (для app.login) и испытания, если toState.name не app.login', если это так, то нет необходимости перенаправлять так вернуться.
  5. Не знаю, почему, но тогда $ OnStateChangeStart срабатывает снова, но для app.main. end it lops снова и снова.

Пожалуйста, помогите.

+0

Эй, я недавно столкнулся с подобной проблемой, и мне пришлось изменить свое объявление иначе, как это было в ответе на это сообщение SO (дайте мне знать, если это поможет): http: // stackoverflow. com/questions/26181141/angularjs-ui-router-other-to-state-вместо-url –

+0

Кажется, что это ответ. Будет проверять немного больше, а затем принять. – Luka

ответ

12

Измените объявление метода otherwise() на переход имени состояния вместо перехода по URL, который вы используете в настоящее время. Это решило это для меня, когда я испытал эту проблему.

Вот пример:

$urlRouterProvider.otherwise(function($injector, $location){ 
    $injector.invoke(['$state', function($state) { 
    $state.go('app.main'); 
    }]); 
}); 

Альтернативный способ получения $state и выполнения $state.go будет

var $state = $injector.get('$state'); 
$state.go('app.main'); 

Я не очень опытный в Угловое, так что я не знаю, почему это решает, поэтому, если кто-нибудь может разработать, пожалуйста, сделайте это!

Update

Принятый ответ в этом SO post, кажется, обеспечивает хорошее объяснение о том, почему это происходит.

+0

это не решает проблему для меня – Pencilcheck

+0

Жаль, что это не помогло, может быть, какой-то код в другом месте вызывает эту ошибку для вас. Если вы не нашли решение, я бы предложил создать новый вопрос, включая соответствующий код, чтобы люди могли помочь вам отладить/исправить его. –

+0

Помогло, спасибо! – Rantiev