2016-05-09 8 views
1

データベースの保存されたデータを表示できるように、その特定のコンポーネントから別のコンポーネントにナビゲートする直前に、Angular 2コンポーネント関連のデータをデータベースに保存したい第2の構成要素。 )私はngOnDestroy(上保存方法と呼ばれることが第二成分に第1成分と表示方法のフックngOnInit()を行うために。別のコンポーネントにナビゲートする前にAngular 2コンポーネントからデータを保存する

しかし、ngOnDestroy()が完全に終了する前に、のように見えます。ngOninit()が呼び出されます。これは、データをデータベースに保存する前に、古いデータを取り出して表示することを意味します。

この問題を解決するのを手伝ってください。

+0

最初のコンポーネントのデータを2つのコンポーネント間の共有サービスにプッシュし、2番目のコンポーネントのinitでサブスクライブすることは可能でしょうか? – echonax

+0

私の場合、2番目のコンポーネントに処理されたデータを表示するために、特定の保存済みアイテムのみが間接的に必要です。したがって、共有サービスを持つことは、このシナリオにはあまり適していません。それはコンポーネントの読み込みを同期させる他の方法でしょうか? – chenk

答えて

2

この目的でCanDeactivateを実装できます。 routerCanDeactivateからPromise returnesがtrue

も参照してくださいhttps://angular.io/docs/ts/latest/api/#!?apiFilter=candeactivate

rc.x

routerCanDeactivate(currTree?: RouteTree, futureTree?: RouteTree) : Promise<boolean> { 
    return new Promise<boolean>((resolve, reject) => { 
    ... 
    }) 
} 

beta.xまたはルータ - 非推奨RCにすることを決議した場合にルータはルート変更を続けています。 x

routerCanDeactivate(nextInstruction: ComponentInstruction, prevInstruction: ComponentInstruction) { 
    return new Promise<boolean>((resolve, reject) => { 
    ... 
    }) 
} 

ルータの廃止予定にはOnDeactivateもあります。 https://angular.io/docs/ts/latest/api/router-deprecated/index/OnDeactivate-interface.html。これは新しいルータにも追加される可能性があります。

+0

ありがとうございます。私は、直接Promiseではなく、 'rxjs/Observable'を使用して戻りたいと考えています。 – chenk

+2

Angularは戻り値の型として 'Promise 'または単に 'boolean'をサポートしますが、observableが完了したときに解決する約束を得るために、observable上で' toPromise() 'を呼び出すことができます。 'toPromise'演算子をインポートすることを忘れないでください。 –

2

ルーティングのコンテキストで、(古い)ルータに依存している場合は、むしろOnActivateOnDeactivateのインターフェイスを活用できます。両方とも約束をサポートするメソッドを含んでいます。

routerOnDeactivateの場合、約束が返された場合、約束は解決するまで待つでしょう。

関連する問題