如何redirect在ui路由器解决?

我试图在一个UI路由器解决scheme内部redirect,并想知道是否有一种方法来重新路由在路由器parsing器。 目前这不是人们所想的。

resolver(auth, $state){ if(!auth.isLoggedIn()){ $state.go('noLoggedInPath'); } } 

如何正确地redirectparsing器?

我的临时黑客是这个,但我不舒服。

 resolver(auth, $state, $timeout){ if(!auth.isLoggedIn()){ $timeout(function () { $state.go('noLoggedInPath'); }, 0); } } 

你可以从你的resolver函数返回一个promise来指示是否继续导航到状态。 如果您决定在其他地方导航 – 拒绝承诺并指定适当的状态:

 resolver($q, $state, $timeout, auth) { var deferred = $q.defer(); // $timeout is an example; it also can be an xhr request or any other async function $timeout(function() { if (!auth.isLoggedIn()) { // user is not logged, do not proceed // instead, go to a different page $state.go('noLoggedInPath'); deferred.reject(); } else { // everything is fine, proceed deferred.resolve(); } }); return deferred.promise; } 

普朗克在这里 。

UPD:更新代码并添加了plunkr。 看起来只有当你把它放在一个超时函数内才有效。

Yauheni的答案确实有效,但为了解决奇怪的超时问题,您可以拒绝承诺,并在$ stateChangeError事件中捕获该承诺,并在那里进行redirect。 像这样…

 state('admin', { resolve: { auth: function(UserService, $q, permissionService) { var deferred = $q.defer(); return UserService.load().then(function(user){ if (permissionService.can(user, {goTo: state})) { return deferred.resolve({}); } else { return deferred.reject({redirectTo: 'some_other_state'}); } } } }); 

然后ui路由器总是广播“stateChangeError”,所以你可以做这样的事情..

 $rootScope.$on('$stateChangeError', function(evt, to, toParams, from, fromParams, error) { if (error.redirectTo) { $state.go(error.redirectTo); } else { $state.go('error', {status: error.status}) } }) 

这是我实际做的,我找不到更好的解决scheme

 resolver($q, $timeout, myService) { if(!areParameterValuesValid() || !isEverythingLogicallyOk()){ var deferred = $q.defer(); $timeout(function() { $state.go('somewhere'); deferred.reject(); }); return deferred.promise; } else { return myService.loadSomething(passingSomeParams); } } 

我认为一个更清晰的答案是返回已经被拒绝的承诺,如下所示:

 resolver(auth, $state, $q){ if(!auth.isLoggedIn()){ $state.go('noLoggedInPath'); // Return rejected promise return $q.reject(); } return true; } 

我用这个

  function Check($state, $q) { var deferred = $q.defer(); if (condition) { deferred.resolve(); } else { deferred.reject(); } return deferred.promise.catch(function () { $state.go('path'); }); } 

您可以使用redirectToconfiguration中的parsing器承诺

  redirectTo: function($transition$) { return $transition$.injector().getAsync('isNew').then(function(isNew) { return isNew ? 'estate.edit' : 'estate.view'; }); }, 

为此,使用解决方法对我来说并不完美。 我调整了这篇文章中的逻辑来对状态对象的data属性执行redirectfunction。 然后,您可以从模块的运行块中敲入$ rootScope上的$ stateChangeStart事件,并使用注入器服务的invoke方法根据指定的条件更改状态。 在模块中也很好地工作。