2016-12-29 66 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');   
     } 
     } 
}); 
相关问题