2014-01-19 59 views
1

我想檢查用戶是否每次轉換到狀態時都記錄,或者它的父節點有一些isLogged數據屬性。我的代碼是:異步調用後暫停轉換並重新啓動

 service.watchHasAccess = function(){ 
     $rootScope.$on('$stateChangeStart', function(event,toState,toStateParams){ 
      if(typeof toState.data !=='undefined' && typeof toState.data.loggedIn !== 'undefined' && toState.data.loggedIn == true){ 
       api.getWithPromise('user/isLoggedIn').then(function(response){ 
        if(response.status !=='OK'){ 
         event.preventDefault(); 
         FlashMessage.showError('Zaloguj się aby przejść tutaj.'); 
         $state.go('MainPage');        
        } 
       }); 
      } 
     }); 

問題是,當轉換到限制狀態時,它會加載,但它幾乎會立即重定向到MainPage狀態。這就像閃光。這是因爲我使用異步請求,所以我認爲狀態只是轉換而不管請求的結果如何,但是接下來的響應就會正常轉換。我想達到的目標是等到承諾解決後再檢查並最終將用戶重定向到「MainPage」。那可能嗎 ?

回答

1

您需要爲您的asyc使用承諾,根據返回的內容解決或拒絕承諾。我建議URL切換將發生在$stateChangeError事件監聽器中,否則將被拒絕承諾。您可以將您想要去reject([data])的位置傳遞給收聽者。

http://fiddle.jshell.net/L9jxf/2/

一些承諾超時後,將拒絕(模擬服務器調用)

 protected: ['$timeout', '$q', function ($timeout, $q) { 
      var deferred = $q.defer(); 
      $timeout(function() { 
       deferred.reject({type:'redirect',location:'401'}); 
      }, 1000); 
      return deferred.promise; 
     }] 

此處理拒絕

app.run(function ($rootScope, $state) { 
    $rootScope.$on('$stateChangeError', function (e, to, toParams, from, fromParams, error) { 
     if (error.type === 'redirect') { 
      $state.transitionTo(error.location); 
     } 
    }); 
}); 
+0

我成功地做到這一點,但我有一個更題。我把這個解決方案放在我的「用戶」狀態,所以如果我去'user.stuff',解析會再次被檢查。問題在於,當進入'user.anything'狀態時,這個解決方案會執行一次,然後當我進入'user.anything2'時,這個解決方案不會再被解析。我有點理解爲什麼會發生這種情況,但問題在於,如果將「state.reload()」置於'user'狀態內使用的每個控制器之上,都有一些更好的解決方案。希望你明白我的問題:) –

+0

我想我明白了。你有多個嵌套在'user'狀態的狀態。每當訪問其中的任何狀態時,都希望「用戶」狀態得到解決。我不認爲這是可能的。在同胞內導航時​​,父狀態永遠不會重新載入,因此永遠不會重新解析。除'$ state.reload()'之外,你可以在每個需要它的狀態下進行解析。 – TheSharpieOne

+0

我認爲這樣做有點矯枉過正,我使用[code] $ state.reload()[/ code],因爲我知道這個控制器總是需要在登錄時使用。無論如何感謝你的回答:) –

相關問題