Anstatt von dort aus zu injizieren ElementRef
und zu verwenden querySelector
oder ähnliches zu verwenden, kann stattdessen eine deklarative Methode verwendet werden, um direkt auf Elemente in der Ansicht zuzugreifen:
<input #myname>
@ViewChild('myname') input;
Element
ngAfterViewInit() {
console.log(this.input.nativeElement.value);
}
StackBlitz Beispiel
- @ViewChild () unterstützt die Direktive oder den Komponententyp als Parameter oder den Namen (String) einer Vorlagenvariablen.
- @ViewChildren () unterstützt auch eine Liste von Namen als durch Kommas getrennte Liste (derzeit sind keine Leerzeichen zulässig
@ViewChildren('var1,var2,var3')
).
- @ContentChild () und @ContentChildren () machen dasselbe, jedoch im hellen DOM (
<ng-content>
projizierte Elemente).
Nachkommenschaft
@ContentChildren()
ist die einzige, mit der auch Nachkommen abgefragt werden können
@ContentChildren(SomeTypeOrVarName, {descendants: true}) someField;
{descendants: true}
sollte die Standardeinstellung sein, ist aber nicht in 2.0.0 final und wird als Fehler angesehen.
Dies wurde in 2.0.1 behoben
lesen
Wenn es eine Komponente und Anweisungen gibt, kann der read
Parameter angeben, welche Instanz zurückgegeben werden soll.
Dies ist beispielsweise ViewContainerRef
für dynamisch erstellte Komponenten anstelle der Standardeinstellung erforderlichElementRef
@ViewChild('myname', { read: ViewContainerRef }) target;
Änderungen abonnieren
Obwohl Ansichtskinder nur festgelegt werden, wenn sie ngAfterViewInit()
aufgerufen werden, und Inhaltskinder nur festgelegt werden, wenn sie ngAfterContentInit()
aufgerufen werden, sollte dies in erfolgen, wenn Sie Änderungen am Abfrageergebnis abonnieren möchtenngOnInit()
https://github.com/angular/angular/issues/9689#issuecomment-229247134
@ViewChildren(SomeType) viewChildren;
@ContentChildren(SomeType) contentChildren;
ngOnInit() {
this.viewChildren.changes.subscribe(changes => console.log(changes));
this.contentChildren.changes.subscribe(changes => console.log(changes));
}
direkter DOM-Zugriff
kann nur DOM-Elemente abfragen, aber keine Komponenten oder Direktiveninstanzen:
export class MyComponent {
constructor(private elRef:ElementRef) {}
ngAfterViewInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
// for transcluded content
ngAfterContentInit() {
var div = this.elRef.nativeElement.querySelector('div');
console.log(div);
}
}
Beliebig projizierten Inhalt erhalten
Siehe Zugriff auf ausgeschlossene Inhalte