UI-Router - 获取错误的确切问题是“超出最大调用堆栈大小”

时间:2016-11-22 06:09:35

标签: angularjs angular-ui-router

我的应用有登录页面,需要重定向到另一个外部网站。我还要求使用相同的登录页面和另一个新的state名称。

我已经做了必要的更改,但我收到的错误是

Maximum call stack size exceeded - 我根本无法理解。如何克服这个?

这是我的代码:

状态提供者的东西:两者都是相同的登录控制器和html

$stateProvider
      .state('login', {
        url: '/',
        templateUrl: 'app/login/login.html',
        controller: 'loginCtrl as ctrl',
        data: {
          requireLogin: false
        }
      })
      .state('fallback', {
        url: '/fallback',
        templateUrl: 'app/login/login.html',
        controller: 'loginCtrl as ctrl',
        data: {
          requireLogin: false
        }
      })

问题:

function stateController($rootScope,  $state,  fsErr ){
    $rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams ) {


      if( toState.name === 'login' ){

        window.location = 'https://cway.cisco.com/fs/';
        event.preventDefault();

      }

      if( toState.name === 'fallback' ){

        console.log('nothing doing') //consoles 1227 times
        $state.go("fallback");
        event.preventDefault();

        return false;

      }
})

1 个答案:

答案 0 :(得分:0)

  

超出最大调用堆栈大小

这类似于无限循环。 $state.go("fallback");被无限调用,从而导致错误。

问题在于: 只要有状态变化,$stateChangeStart就会触发。所以,当$ state更改为后备时,如果true,则再次调用$state.go("fallback");,这将再次触发stateChangeStart,并开始循环。

解决方案:

  1. 您可以删除else if if:

    if( toState.name === 'fallback' && !loop) {
        console.log('nothing doing');
        $state.go("fallback");
        event.preventDefault();
        return false;
    } //delete this if statement
    
  2. 设置一个标志并打破循环。

  3. var loop; //在$ rootScope。$ on。

    之外的父函数中定义
    if( toState.name === 'fallback' && !loop) {
        loop = true
        console.log('nothing doing')
        $state.go("fallback");
        event.preventDefault();
        return false;
    }