2015-12-17 3 views
110

角2は、コンポーネントの子孫要素を照会するための,@ViewChildren,@ContentChildおよび@ContentChildrenのデコレータを提供します。最初の2つと後の2つの違いは何ですか?@ViewChildと@ContentChildの違いは何ですか?

+1

このリンクは、以下の回答を読んだ後、http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders/に役立ちました。乾杯:) –

答えて

164

私は(それがWebコンポーネントから来ている、hereを参照してください)シャドウDOMライトDOM用語を使用して、あなたの質問にお答えします。一般的には:

  • シャドウDOMは - (コンポーネントのクリエイターとして)あなたを定義し、エンドユーザーから隠されているコンポーネントの内部DOMです。例えば:
@Component({ selector: 'some-component', template: ` <h1>I am Shadow DOM!</h1> <h2>Nice to meet you :)</h2> <ng-content></ng-content> `; }) class SomeComponent { /* ... */ } 
  • ライトDOM - コンポーネントにコンポーネント供給エンドユーザーことがDOMです。たとえば:
@Component({ 
    selector: 'another-component', 
    directives: [SomeComponent], 
    template: ` 
    <some-component> 
     <h1>Hi! I am Light DOM!</h1> 
     <h2>So happy to see you!</h2> 
    </some-component> 
    ` 
}) 
class AnotherComponent { /* ... */ } 

だから、あなたの質問への答えは非常に簡単です:

@ViewChildren@ContentChildrenの違いは、シャドウDOM内の要素のための@ViewChildren見ながら、彼らのために@ContentChildren表情でライトDOM。

+3

Minko Gechewのブログエントリhttp://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders/が私には分かりやすい。 @ContentChildrenはコンテンツ投影によって挿入された子(の間の子)です。一方、Minkos Blogから: "一方、与えられたコンポーネントのホスト要素の開始タグと終了タグの間に使われる**要素は、* content children **と呼ばれます。" Angular2でシャドーDOMとビューのカプセル化がここに記述されています:http://blog.thoughtram.io/angular/2015/06/29/shadow-dom-strategies-in-angular2.html。 – westor

+1

私には' (@ContentChildren'の代わりに@TemplateChildren'や '@ContentChildren'の代わりに)' @HostChildren'はもっと良い名前になっていました。私たちが話していることのすべては、ビュー関連であり、wrtバインディングです – superjos

+2

'@ ViewChildren' ==あなた自身の子;' @ ContentChildren' ==他の人の子ども – candidJ

65

名の通り@ViewChild@ViewChildrenのみ直接あなたのビューテンプレート上にある要素を見てのに対し、@ContentChild@ContentChildrenクエリは、ビューの<ng-content></ng-content>要素内の既存のディレクティブを返します。

+0

あなたが@ContentChild(ren)に戻ってくるコンポーネントをビューに持たない限り@ViewChild(ren)を使用しますか? –

20

アンギュラ接続からこのビデオでは、comp-aContentChildcomp-bViewChildであり、

https://youtu.be/4YmnbGoh49U ViewChildren、ViewChild、ContentChildrenとContentChildについて
@Component({ 
    template: ` 
    <my-widget> 
     <comp-a/> 
    </my-widget> 
` 
}) 
class App {} 

@Component({ 
    selector: 'my-widget', 
    template: `<comp-b/>` 
}) 
class MyWidget {} 

my-widgetの観点から優れた情報を持っています。 CompomentChildrenおよびViewChildrenは、xChildが1つのインスタンスを返す間に繰り返し可能な値を返します。

関連する問題