我正在升级到ui-router@1.0.0-beta.2
并尝试找出如果用户没有必要的权限,将用户重定向到其他状态的最佳方法。
这就是我所拥有的:
.state('company_dashboard', {
url: '/dashboard',
templateUrl: 'dashboard.html',
controller: 'CompanyDashboardCtrl',
resolve: {
user: function(UserService) {
return UserService.getActiveUser();
},
company: function(UserService) {
return CompanyService.getActiveCompany();
},
permissions: function(CompanyService, user, company){
return CompanyService.getUserPermissions(company, user);
}
},
onEnter: function($state, permissions) {
if (permissions.canAccessDashboard === false)
return $state.go('company_landing_page');
}
})
以上示例有效,但它记录了以下错误:TransitionRejection(type: 2, message: The transition has been superseded by a different transition, detail: Transition#1( ''{} -> 'company_landing_page'{} ))
这让我觉得,应该有更好的方法。
附带问题,在resolve
?
更新
将$state.go()
更改为$state.target()
帮助我摆脱了控制台错误。 This comment有所帮助。
虽然问题在于,我是否正确地把它做到了正确的地方?
答案 0 :(得分:1)
我会向您的州添加一个数据属性,如下所示:
.state('company_dashboard', {
data: {
requiresAuthentication: true
}
}
然后:
app.run(function ($rootScope, $state) {
$rootScope.$on('$stateChangeStart', function (event, toState, toParams) {
// Check if user is authenticated
// And route requires authentication
if (!toState.data.requiresAuthentication) {
$state.go(toState.name, toParams);
} else if (user && toState.data.requiresAuthentication) {
$state.go(toState.name, toParams);
} else {
$state.go('login');
}
});
});
即使我确信它可以更加精致,但这似乎也能很好地发挥作用,但我希望这可以让您了解如何继续进行。