AngularJS UI路由$ stateChangeStart无法按预期工作

时间:2016-09-05 08:16:42

标签: angularjs angular-ui-router angular-ui state

我创建了一个带有角度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中获得结果时,我将再次使用此功能,但这次我知道在哪个州发送给他。

1 个答案:

答案 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');
            ...