2014-03-25 54 views
3

我採用了棱角分明的UI的UI,路由器在我的項目和狀態變化我要檢查,如果用戶訪問該頁面。如果沒有,我彈出一個登錄模式。UI-Router:更改無加載狀態的網址或推遲加載狀態?

$rootScope.$on('$stateChangeStart', function(evt, toState) { 
    if (!authentication.authorize(toState.data.access)) { 
     evt.preventDefault(); 
     $state.go('login', {}, {notify: false}); 
    } 
}); 

登錄狀態,使用從UI的自舉一個模式:

angular.module('components.security').config(function($stateProvider) { 
    $stateProvider.state('login', { 
     onEnter: function($state, $modal) { 
      $modal.open({ 
       templateUrl: "/components/security/login.html", 
       controller: 'LoginCtrl as controller' 
      }); 
     } 
    }); 
}); 

它的工作完全正常的第一頁加載:與UI視圖不會渲染,登錄模式彈出,並且當用戶登錄時,我呼叫$urlRouter.sync();並加載視圖。

但是,如果你從一個頁面導航頁這是應該發生:

  • 用戶在/ pageA的,點擊一個鏈接到/頁面B(他沒有訪問)
  • 網址更改/頁面B
  • 沒有加載ui的視圖,而不是在登錄模式彈出
  • 後登錄完成模態關閉,用戶界面視圖負載

相反會發生什麼情況是這樣的:

  • 用戶在/ pageA的,點擊即可/頁面B的鏈接(這是他沒有獲得)
  • 網址保持在/ pageA的
  • 登錄模式彈出
  • 登錄完成後的模態關閉,但你仍然在頁面A.

所以我很想是,網址實際上變爲/頁面B,但用戶界面視圖沒有按「T直到你調用同步。

回答

2

你有沒有考慮在您的身份驗證$ stateChangeStart聽衆節約使用toState和angular.copy(toParams),然後觸發$ state.go用戶已登錄後?

的URL未設置爲/頁面B當用戶轉換那裏,因爲當你的preventDefault,過渡防止(和URL重置爲pageA的):

 if ($rootScope.$broadcast('$stateChangeStart', to.self, toParams, from.self, fromParams).defaultPrevented) { 
      syncUrl(); 
      return TransitionPrevented; 
     } 
+0

我沒有,但聽起來像一個簡單完美的解決方案。謝謝! –