0
我使用的是angular1.4,ui.router0.2.15。尝试在$ stateChangeStart中重定向到登录状态。这里的逻辑:
$rootScope.on('$stateChangeStart', function(){
if(!isLoggedIn && toState.name !== 'login') {
console.log('go to login');
e.preventDefault();
$state.go('login');
} else if (isLoggedIn && toState.name === 'login') {
console.log('go to home');
e.preventDefault();
$state.go('home');
} else {
console.log('no change');
}
});
我想执行将是这样的:
event1: from:'', to:'home', 'go to login'
event2: from:'', to:'login', 'no change'
...then proceed
但实际上,它是:
event1: from:'', to:'home', 'go to login'
event2: from:'', to:'login', 'no change'
event3: from:'', to:'home', 'go to login'
event4: from:'', to:'login', 'no change',
event5: from:'', to:'home', 'go to login',
...the dead loop continues until max digest loop
我发现那EVENT3是角UI-触发router.js function registerState
:
// Register the state in the global state list and with $urlRouter if necessary.
if (!state[abstractKey] && state.url) {
$urlRouterProvider.when(state.url, ['$match', '$stateParams', function ($match, $stateParams) {
if ($state.$current.navigable != state || !equalForKeys($match, $stateParams)) {
$state.transitionTo(state, $match, { inherit: true, location: false });
}
}]);
}
但是由于太复杂,我错过了这个问题。
为什么事件3发射?如果我想我的重定向应该注册我自己的事件,如$ myStateChangeStart ???
我想说的是,这里涵盖的所有内容http://stackoverflow.com/a/26702638/1679310 –
@RadimKöhler你是说在app.run注册$ stateChangeStart不推荐?我检查了app.run $ state.current是{ “名”: “”, “URL”: “^”, “意见”:空, “抽象”:真 } – jchnxu
@RadimKöhler的问题是不是我重定向登录两次,而是一个隐形的$ state.transitionTo在ui.router本身发射... – jchnxu