我正在使用Angular 1.3和Angular UI路由器,并希望在加载页面之前检查用户身份验证。
出于某种原因,如果返回$q.reject()
,则无论如何都会重新加载页面(我可以看到它重新加载,并查看httpInterceptors
中的请求)。
我不希望重新加载页面。如果返回$q.reject
,则只需在网址栏中更改回home
状态。
然而,每次返回拒绝时,它都会开始加载下一页然后重定向。如何阻止页面重新加载?
代码:
a)解析用户个人资料,然后测试他们的访问权限
.state('user.agent-admin', {
url: '/agent-admin',
templateUrl: 'views/users/agent-admin.tpl.html',
controller: 'userAgentAdminCtrl',
resolve: {
ProfileLoaded : ['$rootScope', function ($rootScope) {
return $rootScope.loadProfile();
}],
access: ['Access', 'ProfileLoaded', function (Access, ProfileLoaded) {
// could be true or $q.reject();
return Access.hasORRoles(['admin']);
}]
}
});
b)负载配置文件
$rootScope.loadProfile = function () {
if (Session) {
return $q.when(Session);
} else {
return User.getProfile().then(function (res) {
... // set session to user then return
return $q.when(Session);
});
}
};
c)在$q.reject()
上,这不应该重新加载页面,在更改URL状态回到原来的状态并阻止页面加载。
$rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
if (error === 400) {
$state.go('user.home');
}
});
注意:我确实有一个抽象的父状态,它有一个具有http调用的控制器,因此这解释了所做的请求。但是没有解释为什么页面需要重新加载。
.state('user', {
templateUrl: 'views/users/master-user.tpl.html',
url: '',
abstract: true,
controller: 'userMaster'
})
尝试$stateChangeStart
也会重新加载页面:
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
Access.hasORRoles(['admin']).then(function (res) {
}, function (err) {
if (toState.name == 'user.agent-admin') {
$state.go('user.home');
}
});
});
我也试过了:
a)直接拒绝
.state('user.agent-admin', {
url: '/agent-admin',
templateUrl: 'views/users/agent-admin.tpl.html',
controller: 'userAgentAdminCtrl',
resolve: {
test: function ($q) {
return $q.reject(301);
}
...
$rootScope.$on('$stateChangeError', function (event, toState, toParams, fromState, fromParams, error) {
if (error === 301) {
$state.go('user.home');
}
});
b)防止默认(suggested here)
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
$q.reject().then(function (res) {
}, function (err) {
event.preventDefault();
});
});
c)使用新的UI Router 1.0.0 Alpha $transitions.onBefore events:
// resolve user profile before any transitions begin
$transitions.onBefore({to: 'user.*', from: '*'}, function(trans, state) {
var substate = trans.to();
return $rootScope.loadProfile().then(function (prof) {
if (substate.name == 'user.agent-admin') {
return Access.hasORRoles(substate.data.roles);
}
return true;
});
});
$transitions.onError({}, function(trans) {
var error = trans && trans._error;
if (error == 301) {
$state.go('user.home');
}
...
});
无阻止状态变化的事件页面重新加载。