在我的angularjs应用程序中,我正在检查用户是否登陆登录页面并且已经过身份验证,然后将其重定向到主页。
.state('landingpage', {
abstract: "true",
url: "/landingpage",
templateUrl: "app/landingpage/landingpage.html",
resolve: {
AutoLoginCheck: ['$state', '$window', function ($state, $window) {
if($window.localStorage.access_token != null)
{
if($window.sessionStorage.access_token == null) {
$window.sessionStorage.access_token = $window.localStorage.access_token;
}
UserInfoService.SetUserAuthenticated(true);
// it is not redirecting
return $state.go('app.home');
}
}]
}
})
问题是虽然所有解析代码都已成功运行,但用户不会被重定向到app.home。有人能说出为什么会这样吗?
注意:状态' app'还可以决定在“app.home”中显示要显示的数据。状态。
答案 0 :(得分:27)
.state('landingpage', {
abstract: "true",
url: "/landingpage",
templateUrl: "app/landingpage/landingpage.html",
resolve: {
AutoLoginCheck: ['$state','$window', '$q','$timeout', function ($state, $window,$q,$timeout) {
if($window.localStorage.access_token != null)
{
if($window.sessionStorage.access_token == null) {
$window.sessionStorage.access_token = $window.localStorage.access_token;
}
UserInfoService.SetUserAuthenticated(true);
$timeout(function() {
$state.go('app.home')
},0);
return $q.reject()
}
}]
}
})
这对你有用。
答案 1 :(得分:14)
您的问题可以有两种解决方案
首先,您可以发出事件,侦听器将处理您的状态转换。您可以在父控制器的任何位置实现侦听器
其次你可以实现$ stateChangeStart钩子并检查你的重定向条件
$rootScope.$on('$stateChangeStart', function (event, toState) {
if (toState.name === 'landingpage') {
if (!isAuthenticated()) { // Check if user allowed to transition
event.preventDefault(); // Prevent migration to default state
$state.go('home.dashboard');
}
}
});
答案 2 :(得分:13)
您可以改为使用$location.url('/')
。
答案 3 :(得分:0)
您可以使用resolve为控制器提供自定义状态的内容或数据。 resolve是一个可选的依赖关系图,应该注入控制器。
您可以让控制器检查AuthState并相应地进行重定向。
.state('landingpage', {
abstract: "true",
url: "/landingpage",
templateUrl: "app/landingpage/landingpage.html",
resolve: {
AutoLoginCheck: ['$window', function ($window) {
if($window.localStorage.access_token != null)
{
if($window.sessionStorage.access_token == null) {
$window.sessionStorage.access_token = $window.localStorage.access_token;
}
//assuming userInfoService does the authentication
var isAuthenticated = userInfoService.SetUserAuthenticated(true);
return isAuthenticated;
}
}]
},
controller: ['$state','AutoLoginCheck', function($state, AutoLoginCheck){
if(AutoLoginCheck){
//authenticated
$state.go('app.home');
} else {
//redirect to unauthenticated page
$state.go('....');
}
}]
})
答案 4 :(得分:0)
这是一个旧线程,但我使用$ location.path()来完成state.resolve()块内的重定向
答案 5 :(得分:0)
无论如何决定等待承诺状态。你可以做的最好的事情是回报承诺并为你的州添加超时:
checkUrl("http://myBestURL.com", finished { isSuccess in
// Handle logic after return here
})