如何修复'超出最大调用堆栈大小' AngularJS

时间:2014-07-30 04:05:41

标签: javascript angularjs angular-ui-router

我正在使用AngularJs和Ui-Router,我正在尝试设置两个不同的主页,一个用于登录的用户,另一个用于不是用户。但我收到以下错误:

RangeError: Maximum call stack size exceeded

我跑console.trace()我可以看到有一个问题导致状态无限循环(或类似的东西)。 BUt我不知道如何解决它。

以下是生成错误的代码。

.run(function ($rootScope, $state, $location, Auth) {
    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState) {
      if(fromState.name === "") {
        if (Auth.isLoggedIn()) {
            $state.go('main');
            event.preventDefault();
        } else {
          $state.go('welcome');
          event.preventDefault();
        }
      } else {
         if (toState.authenticate && !Auth.isLoggedIn()) {
             $location.path('/login');
             event.preventDefault();
         }
      }
    });

据我所知,它似乎源于if(fromState.name === "")

1 个答案:

答案 0 :(得分:10)

我已创建an example,使用默认页面和auth / unauth用户。可以看到类似的问题here

首先,这将是听众:

app.run(function ($rootScope, $state, $location, Auth) {

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

      var shouldLogin = toState.data !== undefined
                    && toState.data.requireLogin 
                    && !Auth.isLoggedIn ;

      // NOT authenticated - wants any private stuff
      if(shouldLogin)
      {
        $state.go('login');
        event.preventDefault();
        return;
      }


      // authenticated (previously) comming not to root main
      if(Auth.isLoggedIn) 
      {
        var shouldGoToMain = fromState.name === ""
                          && toState.name !== "main" ;

        if (shouldGoToMain)
        {
            $state.go('main');
            event.preventDefault();
        } 
        return;
      }

      // UNauthenticated (previously) comming not to root public 
      var shouldGoToPublic = fromState.name === ""
                        && toState.name !== "public"
                        && toState.name !== "login" ;

      if(shouldGoToPublic)
      {
          $state.go('public');console.log('p')
          event.preventDefault();
      } 

      // unmanaged
    });
});

发生了什么事?

  • 我们检查用户是否已登录。如果没有,但需要访问非公开内容...我们重定向到登录
  • 用户已登录但未直接转到主...我们转让他
  • 用户未登录,但未公开...我们重定向
  • else ...让它成为

以下是各州:

  $stateProvider
    // available for anybody
    .state('public',{
        url : '/public',
        template : '<div>public</div>',
    })
    // just for authenticated
    .state('main',{
        url : '/main',
        template : '<div>main for authenticated</div>',
        data : {requireLogin : true },
    })
    // just for authenticated
    .state('other',{
        url : '/other',
        template : '<div>other for authenticated</div>',
        data : {requireLogin : true },
    })
    // the log-on screen
    .state('login',{
        url : '/login',
        templateUrl : 'tpl.login.html',
        controller : 'LoginCtrl',
    })

检查plunker herehere