2017-07-03 2 views
2

私は<router-outlet>を持つレイアウトコンポーネントを持っていて、子コンポーネントがルータによって動的に挿入されています。子要素が角をつけてレンダリングを終了したことをどのように知ることができますか?

子要素が挿入され、ビューの作成が完了したら、どのように知っていますか?

また、このソリューションを汎用的にしたいので、子コンポーネントのイベントを手動で起動することはできません。

+0

子コンポーネント内でngafterviewinitをチェックしました – Sreemat

+0

「チェック済み」とはどういう意味ですか?親コンポーネントから呼び出されたかどうかをどのように知ることができますか? –

+0

'' – yurzui

答えて

2

@ViewChild結合を使用して<router-outlet>コンポーネントに結合することができます。

/** 
* Gain access to the inner route child. 
*/ 
@ViewChild(RouterOutlet) 
public outlet: RouterOutlet; 

あなたは、このような変化を聞くことができます:<router-outlet>これを追加使用するすべてのコンポーネントの場合

public ngAfterViewInit(): void { 
    this.outlet.activateEvents.subscribe((component) => { 
     // gets passed the new child component instance 
    }); 
    this.outlet.deactivateEvents.subscribe(() => { 
     // the child component has been destroyed 
    }); 
    if (this.outlet.isActivated) { 
     // will be false if there is no child route active 
    } 
} 
+0

ありがとう!私はこのアプローチで解決しました。私のユースケースにはうってつけです。そして、 '@ ViewChild'を使うほうが、'(activate) 'バインディングを使うよりも好きです。 –

+1

@SlavaFominII https://www.bennadel.com/blog/3038-eventemitter-is-an-rxjs-observable-stream-in-angular-2-beta-6.htm#comments_47949 – yurzui

3

ルータがcomponentRefとアタッチを作成router-outletactivateWithメソッドを呼び出しますそれはrouter-outletコンテナにあります。コンポーネントのビューを作成し、DOMに取り付けられている。この時点で

this.activateEvents.emit(this.activated.instance); 

:それはactivateイベントを発します。ただし、添付されたコンポーネントのconstructorのみが実行されます。ライフサイクルフックはまだありません。次回の変更検出では、添付されたコンポーネントのライフサイクルフックが呼び出されます。

yurzuiがあったとしてあなたは(activate)出力を通じてこのイベントをサブスクライブすることができます

<router-outlet (activate)="onActivated($event)"></router-outlet> 

または推奨されていないイベント・エミッター、使用して:だから

this.outlet.activateEvents.subscribe((component) => { 
     this.activated = true; 
}); 

をたとえば、あなたがしたい場合など子コンポーネントにngOnInitが呼び出されたときは、次のようにすることができます。

const activated = false; 

onActivated() { 
    this.activated = true; 
}); 

ngAfterViewInit() { 
    if (this.activated) { 
    // lifecycle hooks for the child component have been called 
    } 
} 
+0

ありがとう!私は合理的な解決策だと思う。しかし、テンプレートに余分なコードを追加することなく、単一の関数の内部で機能を分離することができるので、@ ViewChildアプローチを使用することに決めました。 –

+0

@SlavaFominIIの場合、ThinkingMediaによるアプローチを使用するだけで、ライフサイクルフックは 'activateEvents.subscribe(()=> {//新しい子コンポーネントインスタンスが渡されます。実際に起動されたイベントを購読する方法は重要ではありませんが、このロジックは重要ですngAfterViewInit(){ if(this.activated){'私はAngularがイベントエミッタを直接購読することを推奨していないと思います –

+0

実際には、私はThinkingMediaの答えに基づいて、このソリューションを使用しており、それは素晴らしいです:https://gist.github.com/slavafomin/dc53ae995a449e13807217ae0b582c27 –

関連する問題