2016-11-01 31 views
2

達成したいのは、どのコンポーネントがその親コン​​ポーネントであるかに基づいて、コンポーネントの動作が異なることです。したがって、以下の2つの状況では、子供はわずかに異なる行動をします。私はngAfterViewInit本家以下角2親コンポーネントをチェックする子コンポーネント

constructor(
    el: ElementRef) { 
     this.el = el; 
    } 

    ngAfterViewInit() { 
    const hostElem = this.el.nativeElement; 
    console.log(hostElem); 
    console.log(hostElem.children); 
    console.log(hostElem.parentNode); 
    } 

を実行しようとしました

<parent-a> 
<child></child> 
</parent-a> 

例B

<parent-b> 
<child></child> 
</parent-b> 

が私のために少し遅れている、私はまだ上のヌルましたparentNode

そのようなことを達成する方法はありますか?

+0

あなたはOptionalデコレータを使用することができ、それをオプションにすることができます。代わりに、親からの入力を子に渡して、どのように振舞うかを伝えます。 –

+0

ええ、それはすでにそれを(サービスで)していますが、親が私が期待しているものでない場合はどうなりますか? (私は基本的にApiを構築しています)。私は基本的に、期待される親ノードのリストでエラー/警告を出すことを望んでいます – elasticrash

答えて

2

実際のコンポーネント(ノード要素ではない)が必要な場合は、インジェクタを使用できます。

constructor(private parentB: ParentBComponent){ 
} 

ngAfterViewInit() { 
    this.parentB.someMethod() 
} 

あなたは、いずれかを注入基本コンポーネントを定義し、それから、両方parent-aparent-b継承を持つことができるようにしたい場合は、parent-aparent-bを持って注意してください。それがどのように動作するかをしません

constructor(@Optional() private parentB?: ParentBComponent){ 
} 
+0

もし存在しなければ、私は推測するエラーを投げることができます。そうするかもしれない。それを受け入れる前にそれを試してみてください;) – elasticrash

+0

それはその親の文脈にない場合、意味ですか?その場合、メンバーparentBは未定義になります。 – Meir

+0

一般的に、html要素(parentNodeなど)を使用することは強く推奨されていません。フレームワーク内で作業を行い、更新のためにレンダラーを使用してください。 – Meir

関連する問題