2016-05-10 54 views
0

我有一個簡單的密碼恢復系統。在angularjs中顯示模板之前處理狀態路由

在用戶請求恢復其帳戶後,他將收到一封電子郵件,其中包含可以設置新密碼的頁面鏈接,該鏈接在其參數中包含驗證密鑰。

此鏈接將調用我的應用程序中的一個狀態,我調用core.recover,然後此狀態將顯示一個模板給用戶,他可以在其中設置新密碼,在某些情況下,用戶可能意外訪問此URL,所以我已經創建了一個服務,檢查鏈接是否包含有效的驗證密鑰,如果不是,我希望他被重定向到其他狀態。

所以我創造了我的狀態如下:

.state('core.recover', { 
     url: '/recover', 
     controller: 'RecoverPasswordCtrl', 
     resolve: function(recoverAccountService, $location, $state, $q) { 
      var deferred = $q.defer(); 
      deferred.resolve(); 
      recoverAccountService.get({email:$location.search().email, verificationKey:$location.search().verificationKey}) 
      .$promise.then(function (result) {}).catch(function (err) { 
      $state.go("candidature.pre"); 
      }); 
      return deferred.promise; 
     }, 
     templateUrl: 'views/tmpl/recoverAccount/recover-password.html' 
     }) 

那麼這段代碼是幹什麼的,當用戶打開他的電子郵件中的鏈接,他將調用core.recover狀態,在這種狀態下我有一個承諾,其從檢查給定電子郵件和激活密鑰是否有效的服務返回,如果不是,則在顯示recover-password模板之前,用戶將被重定向到candidature.pre狀態。

但問題是,當承諾返回一些錯誤時,我總是看到recover-password模板很短的時間,然後我被重定向到另一個狀態。

我該如何解決這個問題?

編輯:

我的問題是不是與此類似:

Change state of angular app from resolve method of state provider

正如你可以看到我在這個職位所提供的相同的代碼,我的代碼工作,唯一的問題是我不希望模板在我被重定向到另一個狀態之前在短時間內顯示。

+0

你看了第二個答案中的數據,使用超時?我認爲那將會完成這項工作。我會刪除我的評論btw。 – Michelangelo

回答

0

您應該解決您的承諾爲您服務返回它的響應,並應拒絕承諾如果返回錯誤的狀態

resolve: function($q, recoverAccountService) { 


    var deferred = $q.defer(); 

recoverAccountService.get({email:$location.search().email,verificationKey:$location.search().verificationKey}).$promise.then(function (result) { 
        deferred.resolve(); 
        }).catch(function (err) { 
        deferred.reject(); 
        $state.go("candidature.pre"); 
        }); 

    return deferred.promise; 
} 
+0

我試過,但我得到一個錯誤說:'錯誤:'invocables'必須是一個對象 –

0

解決部分應該總是返回一個對象,因此更新你的決心一部分後:

resolve: { 
    recoverAccounts: function ($q, recoverAccountService) { 

     var deferred = $q.defer(); 
     recoverAccountService.get({ 
     email: $location.search().email, 
     verificationKey: $location.search().verificationKey 
     }).$promise.then(function (result) { 
     deferred.resolve(); 
     }).catch(function (err) { 
     deferred.reject(); 
     $state.go("candidature.pre"); 
     }); 
     return deferred.promise; 
    } 

    } 

而且你應該總是解決的承諾,那麼你收到