angularjs - 在 $stateChangeStart 中使用 $state.go 会导致无限循环

标签 angularjs angular-ui-router

我正在使用 AngularJS ui-router。我正在尝试为未经身份验证的用户实现保护路由。我正在检查用户是否已登录 $stateChangeStart。如果用户未登录则重定向到登录状态。

但是当我在 stateChangeStart 处理程序中使用 $state.go("login") 时,处理程序代码进入无限循环并收到控制台错误“RangeError: Maximum超出调用堆栈大小”

下面是我的代码:

$rootScope.$on('$stateChangeStart',
function(event, toState, toParams, fromState, fromParams) {
    var allowedStates = ["signup","confirmaccount","resetPassword"];
    if(!$window.localStorage.getItem('userInfo') && !(allowedStates.includes($state.current.name)))
    {
        $state.go("login");
    }
}
);

下面是控制台错误的截图。

enter image description here

最佳答案

防止默认行为并在不使用 $state.current.name 的情况下检查允许的状态,因为 toState 已经是 $stateChangeStart 的参数

更新

我认为您在这里需要一个无状态更改逻辑,而不是始终重定向到登录。

$rootScope.$on('$stateChangeStart',
  function(event, toState, toParams, fromState, fromParams) {
    var noChangeStates = ["login", "signup", "confirmaccount", "resetPassword"];
    var noStateChange = noChangeStates.indexOf(toState.name) > -1;

    if (noStateChange) {
      return;
    }

    //Check for Allowed or Not Allowed logic here then redirect to Login
    if (!$window.localStorage.getItem('userInfo')) {
        event.preventDefault();
        $state.go("login")
    }
  }
);

请注意,您还应该将“登录”添加到“无状态更改”

关于angularjs - 在 $stateChangeStart 中使用 $state.go 会导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45960411/

相关文章:

javascript - bs-modal 不显示 AngularStrap 中的内容

angularjs - 即使 `$stateparams` 更改, Controller 也仅初始化一次

javascript - 如何使用 ui 路由器重新加载所有应用程序模块?

angularjs - Angular UI-Router 多个命名 View

javascript - 导入 ReactiveFormsModule 后 Angular 路由器停止工作

javascript - 如何在AngularJs中通过$stateProvider传递参数?

javascript - 使用 JavaScript 的 HTML 动画

javascript - ng-repeat 显示 json 对象 Angular JS

css - 为什么在删除 CSS 宽度参数时 ngDialog div block 会展开为全 Angular ?

javascript - AngularJS:后台进程