我创建了一个带有角度ui路由和状态的应用。此外,我有一个WEB API控制器,可用于了解用户是否经过身份验证。问题是对该WEB API的http请求有一些延迟返回结果,因为它是异步的。
我想,每当用户想要进行状态时,检查是否经过身份验证,并让他访问或重定向到登录页面。但是第一次当app运行时,我想要等到我的WEB API回答。
我有这部分代码
PlatformWeb.run(function ($rootScope, $state, $timeout, Authorization) {
$rootScope.$state = $state;
$rootScope.User = {
isAuthenticated: null,
targetState: null
}
Authorization.isAuthenticated().then(function (result) {
$rootScope.User.isAuthenticated = result;
$state.go($rootScope.User.targetState.name);
})
hasAccess = function () {
return $rootScope.User.isAuthenticated;
}
$rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
$rootScope.User.targetState = toState;
if ($rootScope.User.isAuthenticated == null)
event.preventDefault();
else {
if (!hasAccess()) {
event.preventDefault();
$state.go('PlatformWeb.Login');
}
}
});});
第一次运行app时,$ rootScope.User.isAuthenticated为null,因此我将阻止加载状态。还有我的授权' service我调用我的异步函数来获取用户是否经过身份验证。在我阻止加载状态之前我保留用户想要去的时候,所以当我从WEP API返回结果时,我改变状态' $ state.go($ rootScope.User.targetState.name);&#39 ;到了他想要的状态。然后我知道是否经过身份验证,我问是否有权限。如果他还没有,那么我会将他重定向到登录状态。
但event.preventDefault();
没有按预期工作。当我运行我的应用程序时,我收到此错误' angular.min.js:6未捕获错误:[$ rootScope:infdig] http://errors.angularjs.org/1.3.7/ $ rootScope / infdig?p0 = 10& p1 =%5B%5D&# 39;多次。
Angular文档说:
' 10 $ digest()迭代达成。中止!
观察者在最近5次迭代中被解雇:[]'
在我的逻辑中,' stateChangeStart'条件函数' $ rootScope.User.isAuthenticated == null'与event.preventDefault();将在这里制作应用程序日志,并且在我知道之前不再运行。当我从我的WEBAPI中获得结果时,我将再次使用此功能,但这次我知道在哪个州发送给他。
答案 0 :(得分:0)
我建议,首先要检查导航到当前更改的位置...如果已经重定向则退出
$rootScope.$on('$stateChangeStart',
function (event, toState, toParams, fromState, fromParams) {
// are we already going to redirection target?
if(toState.name === 'PlatformWeb.Login'){
return; // yes, so do not execute the rest again...
}
$rootScope.User.targetState = toState;
if ($rootScope.User.isAuthenticated == null)
event.preventDefault();
else {
if (!hasAccess()) {
event.preventDefault();
// we will redirect here only if not already on that way...
$state.go('PlatformWeb.Login');
...