By Alligator and Bradley Kouchi

Este artículo le introducirá el decorador ViewChild de Angular.
Es posible que existan situaciones en las que desee acceder a una directiva, componente secundario o elemento DOM de una clase principal de componentes. El decorador ViewChild devuelve el primer elemento que coincide con una directiva, un componente o un selector de referencia de plantillas concreto.
ViewChild con DirectivasViewChild hace que sea posible acceder a directivas.
Digamos que tenemos una SharkDirective.
Idealmente, usará @angular/cli para generar (generate) su directiva:
- ng generate directive shark
De lo contrario, es posible que necesite añadirlo manualmente a app.module.ts:
import { SharkDirective } from './shark.directive';
...
@NgModule({
declarations: [
AppComponent,
SharkDirective
],
...
})
Nuestra directiva buscará elementos con el atributo appShark y preparará el texto en el elemento con la palabra Shark:
import {
Directive,
ElementRef,
Renderer2
} from '@angular/core';
@Directive(
{ selector: '[appShark]' }
)
export class SharkDirective {
creature = 'Dolphin';
constructor(elem: ElementRef, renderer: Renderer2) {
let shark = renderer.createText('Shark ');
renderer.appendChild(elem.nativeElement, shark);
}
}
A continuación, añadiremos un Shark a Fin usándolo en la plantilla del componente:
<span appShark>Fin!</span>
Cuando visualice la aplicación en un navegador, se mostrará como:
OutputShark Fin!
Ahora, podemos acceder a la variable de la instancia creature de SharkDirective y estableceremos una variable de instancia extraCreature con su valor:
import {
Component,
ViewChild,
AfterViewInit
} from '@angular/core';
import { SharkDirective } from './shark.directive';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements AfterViewInit {
extraCreature: string;
@ViewChild(SharkDirective)
set appShark(directive: SharkDirective) {
this.extraCreature = directive.creature;
};
ngAfterViewInit() {
console.log(this.extraCreature); // Dolphin
}
}
Usamos un regulador aquí para establecer la variable extraCreature. Observe que esperamos que el enlace de ciclo de vida AfterViewInit acceda a nuestra variable, ya que es aquí cuando los componentes y directivas secundarios están disponibles.
Cuando se visualice la aplicación en un navegador, veremos el mensaje "Shark Fin!" (¡funcionó!). Sin embargo, en el registro de la consola, se mostrará lo siguiente:
OutputDolphin
El componente principal pudo acceder al valor de la directiva.
ViewChild con elementos DOMViewChild permite acceder a elementos DOM nativos que tienen una variable de referencia de plantilla.
Digamos que tenemos un <input> en nuestra plantilla con la variable de referencia #someInput:
<input #someInput placeholder="Your favorite sea creature">
Ahora podemos acceder a <input> con ViewChild y establecer el valor:
import {
Component,
ViewChild,
AfterViewInit,
ElementRef
} from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements AfterViewInit {
@ViewChild('someInput') someInput: ElementRef;
ngAfterViewInit() {
this.someInput.nativeElement.value = 'Whale!';
}
}
Cuando ngAfterViewInit active el valor de nuestro <input> se establecerá a:
OutputWhale!
El componente principal pudo establecer el valor del elemento DOM secundario.
ViewChild con componentes secundariosViewChild hace que sea posible acceder a un componente secundario y a métodos de invocación o variables de instancia de acceso que están disponibles para el secundario.
Digamos que tenemos un ChildComponent. Idealmente, usará @angular/cli para generar (generate) su componente:
- ng generate component child --flat
Si no es así, es posible que deba crear los archivos child.component.css y child.component.html y añadirlos manualmente a app.modul.ts:
import { ChildComponent } from './child.component';
...
@NgModule({
declarations: [
AppComponent,
ChildComponent
],
...
})
Añadiremos un método whoAmI a ChildComponent, que devuelve un mensaje:
whoAmI() {
return 'I am a child component!';
}
A continuación, haremos referencia al componente en la plantilla de nuestra aplicación:
<app-child>child works!</app-child>
Ahora podemos invocar el método whoAmI desde nuestra clase principal de componentes con ViewChild
import {
Component,
ViewChild,
AfterViewInit
} from '@angular/core';
import { ChildComponent } from './child.component';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterViewInit {
@ViewChild(ChildComponent) child: ChildComponent;
ngAfterViewInit() {
console.log(this.child.whoAmI()); // I am a child component!
}
}
Cuando se visualiza la aplicación en un navegador, el registro de la consola mostrará:
OutputI am a child component!
El componente principal pudo invocar el método whoAmI del componente secundario.
Ha aprendido a usar ViewChild para acceder a una directiva, componente secundario y a un elemento DOM desde una clase principal de componentes.
Si la referencia cambia a un nuevo elemento dinámicamente, ViewChild actualizará automáticamente su referencia.
En los casos es los que desee acceder a múltiples secundarios, usará ViewChildren.
Si desea obtener más información sobre Angular, consulte nuestra página sobre el tema Angular para ver ejercicios y proyectos de programación.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
Alligator.io is a developer-focused resource that offers tutorials and insights on a wide range of modern front-end technologies, including Angular 2+, Vue.js, React, TypeScript, Ionic, and JavaScript.
Former Technical Editor at DigitalOcean. Expertise in areas including Vue.js, CSS, React, and more.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.
Full documentation for every DigitalOcean product.
The Wave has everything you need to know about building a business, from raising funding to marketing your product.
Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.
New accounts only. By submitting your email you agree to our Privacy Policy
Scale up as you grow — whether you're running one virtual machine or ten thousand.
Sign up and get $200 in credit for your first 60 days with DigitalOcean.*
*This promotional offer applies to new accounts only.