2016-04-28 52 views
3

我不確定爲什麼會發生這種情況。我試圖聽我的Angular應用程序中的每個狀態變化,並且如果他們不是Auth,則推回用戶登錄。我將他們的加密會話ID存儲在一個cookie中,檢查該cookie是否未定義,並重定向用戶,或者至少這是我正在嘗試做的事情。我將使用toState和toParams參數來指導用戶角色等,因此您現在可以忽略這些作爲此任務的一部分。

任何反饋意見將有幫助。提前致謝!

.run(($rootScope, $state, $cookies) => { 
     $rootScope.$on('$stateChangeStart', (evt, toState, toParams) => { 
      if(!$cookies.get('SessionID')){ 
       evt.preventDefault(); 
       $state.go('login'); 
      } 
     }) 
    }) 

回答

2

由於您在每次狀態更改時都執行此操作,因此您創建了一個無限循環。你可能會這樣漂亮了一點,但這應該讓你有:

.run(($rootScope, $state, $cookies) => { 
     $rootScope.$on('$stateChangeStart', (evt, toState, toParams) => { 
      if(!$cookies.get('SessionID')) 
       { 
       if (toState.name !== "login") { 
       evt.preventDefault(); 
       $state.go('login'); 
       } 
      } 
     }) 
    }) 

以上將讓你開始,但正如你前進,你會發現,有一些你想允許訪問其他國家沒有cookies或認證。處理這個問題的最好方法可能是在每個狀態中定義的自定義屬性。所以,當你定義你的狀態,你會做這樣的事情:

.state('home', {url: '/home', templateUrl: 'views/home.html', authRequired: false}) 
.state('someSecureUrl', {url: '/someSecure.url', templateUrl: 'views/someSecureUrl.html', authRequired: true}) 

然後修改上面的代碼是這樣的:

.run(($rootScope, $state, $cookies) => { 
      $rootScope.$on('$stateChangeStart', (evt, toState, toParams) => { 
       if(!$cookies.get('SessionID') && toState.authRequired) 
        { 
        evt.preventDefault(); 
        $state.go('login'); 
       } 
      }) 
     }) 

你也可以看看這樣使用你的狀態的決心功能。

+0

太棒了!這實際上工作。現在,我將如何實現這一點,以及能夠達到「登錄」狀態?我正在研究$ state atm,並且我似乎無法找到任何可以讓它適用於兩種狀態的東西。除非我在父狀態中嵌套狀態併爲Login/Signup的父狀態授予權限?像$ state.go('auth')(這將路由到它的登錄將主要用於)..會這樣工作嗎? @MikeFeltman –

相關問題