2017-03-07 9 views
2

角度1.6.1およびui-router 1.0.0rc;リダイレクトで角度ui-router 1.0.0rcの遷移が優先されます

私は、ある状態から別の状態にリダイレクトしているときにui-routerの問題に遭遇しています。

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)からに移動しない場合であるが、baz, qux, ..からbarまで)は無限の遷移ループに終わる。

barにリダイレクトする必要があります fooから qux、行くから例えば

、しかしqux -> introループに引っ掛かり:

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

(ブラウザがクラッシュしたので、私はqux -> fooの以前のエラーメッセージはありません)誰かがリダイレクトの解決策を持っているのですか、グローバルキャッチオールを正しく使用しているかどうかを確認できますか?すべてを捕まえることは死のループを引き起こしていますが、それは最初にそれを引き起こしたリダイレクト拒否の問題には二次的です。

+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(何をバカはそれにマイナス1を与えたのですか?) –

+0

@AuntJamaima lol !!それはあなたのために働いてうれしい – kartik

+1

Brill。 Ta!治療をしました。なぜこの-1が与えられたのかを理解できません! – dewd

関連する問題