Invece di iniettare ElementRef
e utilizzare querySelector
o simili da lì, è possibile utilizzare un modo dichiarativo per accedere direttamente agli elementi nella vista:
<input #myname>
@ViewChild('myname') input;
elemento
ngAfterViewInit() {
console.log(this.input.nativeElement.value);
}
Esempio StackBlitz
- @ViewChild () supporta la direttiva o il tipo di componente come parametro o il nome (stringa) di una variabile modello.
- @ViewChildren () supporta anche un elenco di nomi come elenco separato da virgole (attualmente non sono ammessi spazi
@ViewChildren('var1,var2,var3')
).
- @ContentChild () e @ContentChildren () fanno lo stesso ma alla luce DOM (
<ng-content>
elementi proiettati).
discendenti
@ContentChildren()
è l'unico che consente di eseguire query anche per i discendenti
@ContentChildren(SomeTypeOrVarName, {descendants: true}) someField;
{descendants: true}
dovrebbe essere il valore predefinito ma non è in 2.0.0 final ed è considerato un bug.
È stato risolto in 2.0.1
leggere
Se sono presenti un componente e direttive, il read
parametro consente di specificare quale istanza deve essere restituita.
Ad esempio, ViewContainerRef
ciò è richiesto dai componenti creati dinamicamente anziché dal valore predefinitoElementRef
@ViewChild('myname', { read: ViewContainerRef }) target;
iscriviti alle modifiche
Anche se view children è impostato solo quando ngAfterViewInit()
viene chiamato e content child è impostato solo quando ngAfterContentInit()
viene chiamato, se si desidera iscriversi alle modifiche del risultato della query, è necessariongOnInit()
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));
}
accesso DOM diretto
può solo interrogare elementi DOM, ma non componenti o istanze della direttiva:
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);
}
}
ottenere contenuti proiettati arbitrari
Vedi Accedi al contenuto escluso