2017-09-28 11 views
0

親コンポーネントメソッドを呼び出すときに実行したいメソッドを持つ子コンポーネントを作成しました。子コンポーネントがルーティングからロードされたときに子コンポーネントをトリガーする子コンポーネントをトリガー

これは以下のような重複した質問のようです。

Call child component method from parent class - Angular

私は親コンポーネントテンプレートの子コンポーネントが含まれていたときにこれが

<parent-comp> <child-comp></child-comp></parent-comp>. 

のように、完璧に動作しますが、私の場合は私がすることができ、この場合には、ルーティングを使用して、子コンポーネントをロードviewchildがnullになると、子メソッドを実行しません。

以下は、変更が加えられたクイックスタート角度アプリです。

import { Component, ViewChild } from "@angular/core"; 
import { ItemCompanyComponent } from "../item/Company/ItemCompanyComponent"; 

@Component({ 
    moduleId: module.id, 
    selector: "item-add", 
    templateUrl: "ItemComponent.html" 
}) 
export class ItemComponent { 

    @ViewChild(ItemCompanyComponent) public child: ItemCompanyComponent; 

    ngAfterViewInit(): void { 
     this.save =() => { 
      alert("Item Component Save"); 
      this.child.childsave(); 
     } 
    } 

    save(): void { 

    } 
} 



@Component({ 
    moduleId: module.id, 
    selector: "item-company", 
    templateUrl: "ItemCompanyComponent.html" 
}) 
export class ItemCompanyComponent { 
childsave(): void { 
     alert("Item Company Component Save"); 
    } 
} 

ItemComponent.html:

<div class="main-content" fxFlex> 
      <router-outlet></router-outlet> 
     </div> 

私はアイテムのコンポーネントに子プロパティにnullを取得しています。どのような解決策も非常に認められる。

答えて

1

共有サービスを使用して、ルータによって追加されたコンポーネントと通信します。

あなたは、私はほとんど20子コンポーネントが存在していコンポーネントがルータ

<router-outlet (activate)="notifyChild()"></router-outlet> 
+0

によって追加されたときに知っている親のためのactivateイベントを使用することができます。ルーティングによってロードされます。したがって、親コンポーネントにあるsaveをクリックすると、ロードされた子コンポーネントのsaveを呼び出す必要があります。この(アクティブな)イベントエミッタを使用すると、これを実現できますか?そうでない場合は、どうすれば達成できますか? – Bhimisetty

+0

Activeは、コンポーネントが追加されたことを通知するだけです。 "save"について通知したい場合、 '(activate)=" ... "'を使う必要はないようです。残りは共有サービスを使用して行うことができます。共有サービスを使用するコンポーネント通信については約1kの質問があり、angular.ioのドキュメントには「コンポーネント通信」のセクションも含まれています。 –

+0

私はこのような場合、共有サービスは良いアプローチではないと思います。私たちは他にどんな選択肢がありますか? – Bhimisetty

関連する問題