我的应用有登录页面,需要重定向到另一个外部网站。我还要求使用相同的登录页面和另一个新的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;
}
})
答案 0 :(得分:0)
超出最大调用堆栈大小
这类似于无限循环。 $state.go("fallback");
被无限调用,从而导致错误。
问题在于:
只要有状态变化,$stateChangeStart
就会触发。所以,当$ state更改为后备时,如果true
,则再次调用$state.go("fallback");
,这将再次触发stateChangeStart
,并开始循环。
解决方案:
您可以删除else if if:
if( toState.name === 'fallback' && !loop) {
console.log('nothing doing');
$state.go("fallback");
event.preventDefault();
return false;
} //delete this if statement
设置一个标志并打破循环。
var loop; //在$ rootScope。$ on。
之外的父函数中定义if( toState.name === 'fallback' && !loop) {
loop = true
console.log('nothing doing')
$state.go("fallback");
event.preventDefault();
return false;
}