En lugar de inyectar ElementRef
y usar querySelector
o similar desde allí, se puede usar una forma declarativa para acceder directamente a los elementos en la vista:
<input #myname>
@ViewChild('myname') input;
elemento
ngAfterViewInit() {
console.log(this.input.nativeElement.value);
}
Ejemplo de StackBlitz
- @ViewChild () admite el tipo de directiva o componente como parámetro, o el nombre (cadena) de una variable de plantilla.
- @ViewChildren () también admite una lista de nombres como lista separada por comas (actualmente no se permiten espacios
@ViewChildren('var1,var2,var3')
).
- @ContentChild () y @ContentChildren () hacen lo mismo pero a la luz DOM (
<ng-content>
elementos proyectados).
descendientes
@ContentChildren()
es el único que permite consultar también descendientes
@ContentChildren(SomeTypeOrVarName, {descendants: true}) someField;
{descendants: true}
debería ser el valor predeterminado pero no está en la versión 2.0.0 final y se considera un error
Esto se solucionó en 2.0.1
leer
Si hay un componente y directivas, el read
parámetro permite especificar qué instancia debe devolverse.
Por ejemplo, ViewContainerRef
eso es requerido por los componentes creados dinámicamente en lugar del predeterminadoElementRef
@ViewChild('myname', { read: ViewContainerRef }) target;
suscribir cambios
Aunque los elementos secundarios de vista solo se configuran cuando ngAfterViewInit()
se llama y los elementos secundarios de contenido solo se configuran cuando ngAfterContentInit()
se llama, si desea suscribirse a los cambios del resultado de la consulta, debe hacerlo enngOnInit()
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));
}
acceso DOM directo
solo puede consultar elementos DOM, pero no componentes o instancias de directivas:
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);
}
}
obtener contenido proyectado arbitrario
Ver Acceso a contenido transcluido