错误:Angular Ui 路由器状态更改时超出了最大调用堆栈大小堆栈、路由器、大小、状态

2023-09-06 08:52:07 作者:予之笑颜

基本上我要做的是根据用户身份验证状态更改状态.

Basically what I'm trying to do is change the state depending on user authentication status.

当我在没有 $rootScope 的情况下执行 $state.go(); 时,我可以在没有错误的情况下重定向到页面,但是当我使用

When I do $state.go(); without $rootScope, I can redirect to the page without the error but when I do with

$rootScope.$on('$stateChangeStart', function (event) {$state.go();event.preventDefault()})

以下是控制器代码:

DiaryDashboard.controller('AppController', 
  ['$scope', '$rootScope', '$localStorage', '$http', '$state'
  , function ($scope, $rootScope, $localStorage, $http, $state) {

  $rootScope.$on('$stateChangeStart', function (event, toState) {

    if ($localStorage.userdetails &&
        $localStorage.userdetails.isAuthenticated == true) {

        //Check for Authentication state
        //If not redirect to the state in the else clause
        //Populate the $rootScope with user details
        $rootScope.userdetails = $localStorage.userdetails;

        //Switch to the parent state
        $state.go();
        event.preventDefault();

    } else {

        //If User not authenticated
        //GO to the Authentication State
        $state.go('auth');
        event.preventDefault();

    }
  })

}]);

推荐答案

这里最重要的是要明白这一点:

The most important thing here is to understand this:

如果不需要,请不要重定向.换句话说,如果用户已经被重定向到预期状态 - 我们应该离开......有 一个工作plunker 具有类似的解决方案.

Do not redirect if not needed. Other words, if user is already redirected to intended state - we should leave... There is a working plunker with similar solution.

查看此问答答:

调整后的代码:

$rootScope.$on('$stateChangeStart', function (event, toState) {

    var isNavigatingToAuth = toState.name === "Auth";

    if(isNavigatingToAuth){

       return; // no need to redirect 
    }

    if ($localStorage.userdetails &&
        $localStorage.userdetails.isAuthenticated == true)
    ...