2015-03-02 50 views
1

在我的angularjs應用程序(使用angular-ui)中,在刷新瀏覽器時,在從服務器獲取安全上下文之前,正在加載特定狀態的模板。 $ http調用獲取安全上下文正在被命中,但由於它是異步的,它們還沒有設置。AngularJS |在刷新瀏覽器時,angularjs模板會在安全上下文之前加載。如何阻止它?

解決此問題的最佳方法是什麼?

還有,我一直在努力做到以下幾點:

//on the state change event from refresh 

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){ 
    console.log("state change has started"); 
    if(fromState.name === '' && fromState.url === '^'){ 
     console.log("inside state change from refresh"); 
     //what needs to be done in this block to let the security context is fetched (should I use $timeout etc.) ? 
      ......... 
      ......... 
    } 
}); 
+1

剛一說明,我使用root狀態和決心,加載所有的數據的安全性..草擬的例子可以在這裏找到http://stackoverflow.com/a/26241415/1679310 – 2015-03-02 10:13:37

+0

是的,我已經嘗試過,但我的應用程序增長有點太多,有不是一個「根」狀態。我知道這聽起來有點荒謬,但不能應用這種方法,因爲如果我必須在這些狀態中注入解析對象,我將不得不在很多地方執行它。我想這是最好的方法,但遺憾的是我不能使用它。非常感謝,非常感謝。 還有別的辦法嗎? – 2015-03-02 10:30:40

回答

1

我們使用以下兩個代碼片段來解決這個問題。在我們結束之前,我們嘗試了其他幾種方法。這一次似乎是相當強勁...

在UserService廠:

 // setup UserService OBject 
    ... 
    // bootstrap the Service 
    var tokenRetrieved = $location.search().token || localStorageService.get(AUTH_COOKIE_NAME); 

    if (tokenRetrieved) { 
       UserService.login(tokenRetrieved, true) 
        .then(function success(user) { 
         UserService.initialized = true; 
        }, function error(err) { 
         localStorageService.remove(AUTH_COOKIE_NAME); 
         UserService.initialized = true; 
        }); 
    } else { 
      UserService.initialized = true; 
    } 

    return UserService; 

而且在$ stateChangeStart處理程序:

  if (UserService.initialized) { 
       // here we check authorization for the toState 
       .... 


      } else { 
       // if the UserService is not done initializing we cancel the stateChange and schedule it again in 200ms 
       event.preventDefault(); 
       $rootScope.$log.log('preventing state change, because UserService not ready to check Authorization'); 
       $timeout(function() { 
        $state.go(toState, toParams); 
       }, 200); 
      } 
1

event.preventDefault(); 

你如果塊中。它將停止狀態改變。然後安全檢查後,你可能會做

$state.go(toState, toParams); 

但這是錯誤的方法。就像@Radim建議的那樣,你必須使用resolve。

相關問題