ui-router リゾルバでリダイレクトするにはどうすればいいですか? 質問する

ui-router リゾルバでリダイレクトするにはどうすればいいですか? 質問する

私は ui-router 解決内でリダイレクトしようとしており、ルーター リゾルバー内で再ルーティングする方法があるかどうか知りたいです。現在、これは思ったようには機能しません。

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

リゾルバで正しくリダイレ​​クトするにはどうすればよいでしょうか?

私の一時的なハックはこれですが、私はそれに慣れていません。

resolver(auth, $state, $timeout){
   if(!auth.isLoggedIn()){
        $timeout(function () {

             $state.go('noLoggedInPath');
        }, 0);
   }
}

ベストアンサー1

Yauheni の回答は機能しますが、奇妙なタイムアウトを回避するには、Promise を拒否し、$stateChangeError イベントでそれをキャッチして、そこでリダイレクトを行うことができます。次のようになります...

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-router は常に「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})
  }
})

おすすめ記事