2015-12-17 41 views
110

Angular 2 stellt @ViewChild, @ViewChildren, @ContentChild und @ContentChildren Dekoratoren für die Abfrage der abstammenden Elemente einer Komponente bereit. Was ist der Unterschied zwischen den ersten beiden und den letzten beiden?Was ist der Unterschied zwischen @ViewChild und @ContentChild?

+1

Dieser Link half mir http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders/ nach dem Lesen der untenstehenden Antworten. Prost :) –

Antwort

164

Ich werde Ihre Frage mit Schatten DOM und Licht DOM Terminologie beantworten (es von Web-Komponenten kommen, siehe here). Allgemein gilt:

  • Schatten DOM - ist eine interne DOM Ihrer Komponente, die von Ihnen definiert ist (als Schöpfer der Komponente) und von einem Endbenutzer verborgen. Zum Beispiel:
@Component({ 
    selector: 'some-component', 
    template: ` 
    <h1>I am Shadow DOM!</h1> 
    <h2>Nice to meet you :)</h2> 
    <ng-content></ng-content> 
    `; 
}) 
class SomeComponent { /* ... */ } 
  • Licht DOM - ist ein DOM dass ein Endbenutzer Ihrer Komponente Versorgung in Ihrer Komponente. Zum Beispiel:
@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 { /* ... */ } 

die Antwort auf Ihre Frage ist also recht einfach:

Der Unterschied zwischen @ViewChildren und @ContentChildren ist, dass @ViewChildren Look für Elemente in Schatten DOM während @ContentChildren sucht sie in Licht DOM.

+3

Der Blog Eintrag http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders/ von Minko Gechew macht mehr Sinn für mich. @ContentChildren sind die untergeordneten Elemente, die durch die Inhaltsprojektion eingefügt werden (die untergeordneten Elemente zwischen ). Von Minkos Blog: "Andererseits werden ** Elemente, die zwischen den öffnenden und schließenden Tags des Host-Elements einer bestimmten Komponente verwendet werden, als * content children ** bezeichnet." Shadow DOM und View Encapsulation in Angular2 ist hier beschrieben: http://blog.Thoughtram.io/angular/2015/06/29/Shadow-Dom-Strategies-in-angular2.html. – westor

+1

Für mich klingt es wie' @ TemplateChildren' (anstelle von '@ ViewChildren') oder' @HostChildren' (anstelle von '@ ContentChildren') wären viel bessere Namen gewesen, da in diesem Kontext alles, worüber wir sprechen, view-related und binding ist ist auch inhaltsbezogen – superjos

+2

'@ ViewChildren' == Ihr eigenes Kind;' @ ContentChildren' == jemand anderes Kind – candidJ

65

Wie der Name schon sagt, @ContentChild und @ContentChildren Abfragen werden Richtlinien Rückkehr innerhalb des <ng-content></ng-content> Element Ihrer Ansicht bestehenden, während @ViewChild und @ViewChildren nur auf Elemente suchen, die direkt auf Ihrer Ansicht Vorlage sind.

+0

Also verwenden Sie @ViewChild (ren), es sei denn, Sie haben Komponenten in Ihrer Ansicht, in diesem Fall zurück zu @ContentChild (ren)? –

20

Dieses Video von Angular Connect verfügt über hervorragende Informationen über ViewChildren, ViewChild, ContentChildren und ContentChild https://youtu.be/4YmnbGoh49U

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

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

Von my-widget ‚Sicht comp-a die ContentChild und comp-b ist die ViewChild. CompomentChildren und ViewChildren geben ein iterables zurück, während xChild eine einzelne Instanz zurückgibt.