2015-10-20 171 views
2

我得到這個代碼無限循環無限循環:角UI路由器時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。 一遍又一遍地結束它。

請幫忙。

+0

嗨,我不久前遇到過類似的問題,我不得不將其他方法的聲明更改爲如何在此SO帖子的回覆中(讓我知道是否有幫助):http:// stackoverflow。 com/questions/26181141/angularjs-ui-router-otherwise-to-state-instead-of-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'); 

我不是非常的角經歷,所以我不知道爲什麼。這解決了它,所以如果有人可以詳細說明請做!

更新

在此SO post接受的答案似乎提供爲什麼出現這種情況了很好的解釋。

+0

這並不能解決我的問題 – Pencilcheck

+0

對不起,它沒有幫助,也許其他地方的代碼是爲你造成這個錯誤。如果您還沒有找到解決方案,我會建議創建一個包括相關代碼的新問題,以便人們可以幫助您調試/修復它 –

+0

幫助,謝謝! – Rantiev