2017-03-07 101 views
2

角度1.6.1和ui-router 1.0.0rc;角度ui路由器1.0.0rc轉換取代重定向

我遇到了ui-router問題,同時從一個狀態重定向到另一個狀態。

A TransitionRejection因爲被取代而被註冊。

Transition #1 r0: Started -> "Transition#1('intro'{} -> 'foo'{})" 
Transition #1 r0: <- Rejected "Transition#1('intro'{} -> 'foo'{})", reason: TransitionRejection(type: 2, message: The transition has been superseded by a different transition, detail: 'bar'{"id":"uuid-1234-uuid"}) 
Transition #2 r0: Ignored <> "Transition#2('intro'{} -> 'intro'{})" 
Transition #3 r0: Started -> "Transition#3('intro'{} -> 'bar'{"id":"uuid-1234-uuid"})" 
Transition #3 r0: <- Success "Transition#3('intro'{} -> 'bar'{"id":"uuid-1234-uuid"})", final state: bar 

注:全球有所有,它是用於身份驗證控件時加載的狀態,當用戶沒有解決一個問題:

// state 'intro' is '/' 
.config($urlRouterProvider => { 
    $urlRouterProvider.otherwise('/'); 
}) 
.run(($transitions, $trace) => { 
    $trace.enable('TRANSITION'); 
    $transitions.onError({}, trans => trans.router.stateService.go('intro')); 
} 

過渡段

// there is no foo component, it's a straight redirect 
.component('bar', { 
    template: someTemplate, 
    controller: someCtrl 
}) 
.config($stateProvider => { 
    let states = [ 
    { 
     name: 'foo', 
     url: '/foo', 
     redirectTo: { state: 'bar', params: { id: 'uuid-1234-uuid' } } 
    }, 
    { 
     name: 'bar', 
     url: '/bar/:id', 
     component: 'bar' 
    } 
    ]; 

    states.forEach(s => $stateProvider.state(s)); 
}) 

而在這個intro -> foo的例子最終會以正確的狀態bar結束,其他轉換(當不從intro(default)bar,但從baz, qux, ..bar)最終在一個無盡的過渡循環。

例如,從quxfoo,這應該重定向到bar去,但被逮住在qux -> intro循環:(我沒有的qux -> foo以前的錯誤消息,因爲該瀏覽器崩潰)

TransitionRejection(type: 2, message: The transition has been superseded by a different transition, detail: Transition#2704('qux'{} -> 'intro'{})) 

有沒有人有重定向的解決方案,或者可以看到我是否正確使用全局捕獲?全部捕獲都會導致死亡循環,但這是次要的首先觸發它的重定向拒絕問題。

+0

這可能是因爲我的用法是不正確的,但不知道爲什麼重定向觸發器'transition.onError'。一個補丁可以改進匹配條件:'$ transition.onError({to:state =>!state.redirectTo},trans => trans.router.stateService.go('intro'));'而不是一個''。 onError({},...)' – Billiam

回答

0

如果你從轉換鉤子而不是使用stateService.go返回一個目標狀態,那麼就我目前對ui-router的理解而言,這個問題應該消失。

+0

return trans.router.stateService.target('stateB'); –

+0

雖然返回值被忽略onError掛鉤,所以上述解決方案將不適用於你的情況。 –

+0

「trans」不是有效的提供者。你能給出一個實際可行的代碼示例嗎? –

3

當您在前一個狀態更改事件完成之前嘗試觸發狀態更改時,會發生過渡暫停錯誤。 解決此問題的一種簡單方法是在超時後調用狀態更改。它允許當前狀態改變完成,然後觸發下一個狀態改變。

$timeout(function(){ 
    $state.go('statename') 
}) 

注:此處的超時沒有定義的時候,那只是意味着當前所有工序均由內部完成後,它將被執行

+1

這個答案適合我。 +1(什麼白癡給它一個減號?) –

+0

@AuntJamaima哈哈!很高興它爲你工作 – kartik

+1

布里爾。 TA!工作過一種享受。不能不理解爲什麼這是-1! – dewd