AngularJS 在 $stateChangeStart 循环上

AngularJS on $stateChangeStart loop

在我想要的 Web 应用程序中,当用户在 $state 中路由时,Angular 检查是否有令牌以及他是否有权限。但我有一个问题:即使我执行 event.preventDefault(),它也会开始循环并且浏览器崩溃。我怎样才能防止这个循环让用户去或阻止导航?

代码:

  .run(function ($rootScope, $window, $state, Auth) {
  $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, $window) {

// Easy case that doesn't loop: just 'return'
if (toState.name === 'login' ){
    // doe she/he try to go to login? - let him/her go
    return;
}

if (Auth.isLoggedIn && $window.localStorage.identityToken) {

  var requiredAdmin = toState.data.requiredAdmin; 
  if (requiredAdmin && $window.localStorage.isAdmin){
    $state.go(toState.name); // it starts the loop
  } else { // if he is logged but has no permission, stop the navigation
    $state.go(fromState.name); // it starts the loop
  }

  return;
}

});

你应该检查更高的状态而不是每次状态变化,所以如果你有像 /login, /secured, /secured/.... 这样的路由,你可以检查 / 的 resolve 子句安全状态否则您的逻辑将在每次状态更改时执行,这不是 authentication/authorization 流程的正确方法。

https://github.com/angular-ui/ui-router/wiki.

这样你只检查一次子路径。