2015-12-17 17 views
110

Angular 2 fornisce @ViewChild, @ViewChildren, @ContentChild e @ContentChildren decoratori per l'interrogazione degli elementi discendenti di un componente. Qual è la differenza tra i primi due e gli ultimi due?Qual è la differenza tra @ViewChild e @ContentChild?

+1

Questo collegamento mi ha aiutato http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders/ dopo aver letto le risposte di seguito. Saluti :) –

risposta

164

Risponderò alla tua domanda utilizzando Ombra DOM e Luce DOM terminologia (che sono venuti da componenti web, vedi here). In generale:

  • Ombra DOM - è un DOM interna del componente che si definisce da voi (come creatore del componente) e nascosto da un utente finale. Per esempio:
@Component({ 
    selector: 'some-component', 
    template: ` 
    <h1>I am Shadow DOM!</h1> 
    <h2>Nice to meet you :)</h2> 
    <ng-content></ng-content> 
    `; 
}) 
class SomeComponent { /* ... */ } 
  • Luce DOM - è un DOM che un utente finale della vostra fornitura di componenti nel componente. Per esempio:
@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 { /* ... */ } 

Quindi, la risposta alla tua domanda è piuttosto semplice:

La differenza tra @ViewChildren e @ContentChildren è che @ViewChildren cercare elementi in ombra DOM mentre @ContentChildren cercarli in DOM leggero.

+3

Il post di blog http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders/ di Minko Gechew ha più senso per me. @ContentChildren sono i bambini, inseriti dalla proiezione del contenuto (i bambini tra ). Dal blog di Minkos: "D'altra parte, ** elementi che vengono utilizzati tra i tag di apertura e di chiusura dell'elemento host di un dato componente sono chiamati * content children **." Shadow DOM e visualizzazione dell'incapsulamento in Angular2 sono descritti qui: http://blog.thoughtram.io/angular/2015/06/29/shadow-dom-strategies-in-angular2.html. – westor

+1

A me sembra che sia' @ TemplateChildren' (invece di '@ ViewChildren') o' @ HostChildren' (invece di '@ ContentChildren') sarebbe stato un nome molto migliore, in quanto in questo contesto tutto ciò di cui stiamo parlando è correlato alla vista e vincolante – superjos

+2

'@ ViewChildren' == il proprio figlio;' @ ContentChildren' == il figlio di qualcun altro – candidJ

65

Come suggerisce il nome, @ContentChild e @ContentChildren query torneranno direttive esistenti all'interno dell'elemento <ng-content></ng-content> della visualizzazione, mentre @ViewChild e @ViewChildren guardare solo a elementi che sono sul vostro modello di vista direttamente.

+0

Quindi utilizzare @ViewChild (ren) a meno che non si disponga di componenti nella vista, nel qual caso ricorrere a @ContentChild (ren)? –

20

Questo video da Angular Connect ha ottime informazioni su ViewChildren, ViewChild, ContentChildren e ContentChild https://youtu.be/4YmnbGoh49U

@Component({ 
    template: ` 
    <my-widget> 
     <comp-a/> 
    </my-widget> 
` 
}) 
class App {} 

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

Dal punto di vista my-widget s', comp-a è il ContentChild e comp-b è la ViewChild. CompomentChildren e ViewChildren restituiscono un iterable mentre xChild restituisce una singola istanza.

Problemi correlati