私は 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})
}
})