2016-12-29 88 views
1

我只是學習UI路由器的解決方案,並希望簡單地重定向我的狀態,如果用戶沒有登錄。

看來我不能簡單地在回調函數中使用$state.go

這裏是我的代碼:

.state('base.user', { 
    url: '/user', 
    templateUrl: 'views/user.html', 
    controller: 'userCtrl', 
    resolve: { 
    test: function($state, $q) { 
     var deferred = $q.defer(); 
     if (!loggedIn()) { // resolves to false when not logged-in 
     deferred.reject(); 
     $state.go('base.test'); // ** Throws "Possibly unhandled rejection" error 
     } else { 
     deferred.resolve(); 
     /* and maybe do some more stuff.. */ 
     } 
    } 
    } 
}) 

我知道這通常與服務之類的東西做了,但現在,我只想一個簡單的工作示例。

回答

2

我們決定處理它的方式是聽$stateChangeError,如果拋出的錯誤包含路徑,則轉到該路徑。

$rootScope.$on('$stateChangeError', function(toState, toParams, fromState, fromParams, error) { 
    if (error.state) { 
    $state.go(error.state, error.stateParams); 
    } 
}); 

而且在您解決:

test: function($q) { 
    var deferred = $q.defer(); 
    if (!loggedIn()) { 
    deferred.reject({state: 'base.test'}); 
    } else { 
    deferred.resolve(); 
    } 
    return deferred.promise; 
} 
1

落實$ stateChangeStart鉤檢查有你的重定向狀態

$rootScope.$on('$stateChangeStart', function (event, toState) {  
    if (toState.name === 'base.user') {    
     if(!loggedIn()) { // Check if user allowed to transition     
      event.preventDefault(); // Prevent migration to default state     
      $state.go('base.test');   
     } 
     } 
});