2015-10-19 61 views
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 ???

+0

我想说的是,这里涵盖的所有内容http://stackoverflow.com/a/26702638/1679310 –

+0

@RadimKöhler你是说在app.run注册$ stateChangeStart不推荐?我检查了app.run $ state.current是{ “名”: “”, “URL”: “^”, “意见”:空, “抽象”:真 } – jchnxu

+0

@RadimKöhler的问题是不是我重定向登录两次,而是一个隐形的$ state.transitionTo在ui.router本身发射... – jchnxu

回答

0

我真的不明白ui.router的机制是什么。但是我侵入它就像做初始路线改变(也就是状态''来陈述'家')而不是在处理程序中。但在别的地方。在我看来,只有当应用程序第一次引导时才会出现问题。

步骤:

词根记忆根抽象的状态,做$ stateChangeStart处理器相同的重定向逻辑。

2.增加

if(!from.name) { 
    return; 
} 

到$ stateChangeStart处理程序的开始。