View Child en Angular

  1. Use el ViewChild con elementos DOM en Angular
  2. Use el ViewChild con componentes secundarios en Angular
View Child en Angular

El @ViewChild es un decorador en Angular que se usa más comúnmente. Es uno de los primeros decoradores con los que nos encontramos mientras aprendemos Angular.

@ViewChild tiene muchas características discutidas en este tutorial, con ejemplos prácticos para cada caso de uso.

El @ViewChild es un decorador de propiedades que configura una consulta de vista. La propiedad se actualiza si la vista DOM cambia y un nuevo elemento secundario coincide con el selector.

Podemos usar @ViewChild con directivas, elementos DOM y componentes secundarios. Podemos entender cómo usar @ViewChild con ellos en ejemplos.

Vamos a crear una nueva aplicación usando el siguiente comando.

# angular
ng new my-app

Después de crear nuestra nueva aplicación en angular, iremos a nuestro directorio de aplicaciones usando este comando.

# angular
cd my-app

Ahora, ejecutemos nuestra aplicación para verificar si todas las dependencias están instaladas correctamente.

# angular
ng serve --open

Vamos a crear una directiva, LanguageDirective. Esta directiva buscará elementos con el atributo appLanguage y antepondrá el texto del elemento con la palabra Idioma.

Hay dos formas de generar una directiva usando @angular/cli o creando un archivo language.directive.ts.

# Angular
ng generate directive language --skip-tests

Este comando creará un archivo language.directive.ts y agregará la directiva al archivo app.module.ts. Y usaremos ElementRef y Renderer2 para reescribir el texto.

Entonces, nuestro código en language.directive.ts se verá como a continuación.

# angular
import {
  Directive,
  ElementRef,
  Renderer2
} from '@angular/core';

@Directive(
  { selector: '[appLanguage]' }
)
export class LanguageDirective {
  language = 'NodeJs';

  constructor(elem: ElementRef, renderer: Renderer2) {
    let language = renderer.createText('Language ');
    renderer.appendChild(elem.nativeElement, language);
  }
}

Y el código en app.module.ts se verá como a continuación.

# Angular
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';
import { LanguageDirective } from './language.directive';

@NgModule({
  imports: [BrowserModule, FormsModule],
  declarations: [AppComponent, HelloComponent, LanguageDirective],
  bootstrap: [AppComponent],
})
export class AppModule {}

Agregue el atributo appLanguage a li que contiene texto en la plantilla del componente. Entonces, nuestro código en app.component.html se verá como a continuación.

# Angular
<h2>Programming Languages</h2>
<ul>
  <li appLanguage>Angular</li>
  <li appLanguage>React</li>
  <li appLanguage>React Native</li>
</ul>

Producción:

viewchild en angular con directiva

La palabra Language antes del contenido del elemento también puede acceder a la variable de instancia de LanguageDirective y establecer una variable de instancia extraLanguage con su valor.

Entonces, nuestro código en app.component.ts se verá como a continuación.

# Angular
import { Component, ViewChild, AfterViewInit } from '@angular/core';
import { LanguageDirective } from './language.directive';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterViewInit {
  extraLanguage!: string;

  @ViewChild(LanguageDirective)
  set appLanguage(directive: LanguageDirective) {
    this.extraLanguage = directive.language;
  }

  ngAfterViewInit() {
    console.log(this.extraLanguage); // NodeJs
  }
}

Hemos utilizado un setter en el código anterior para establecer la variable extraLanguage.

Ahora, notará que esperará a que el enlace del bucle de vida AfterViewInit acceda a la variable porque los componentes secundarios y las directivas estarán disponibles después de que se cargue la vista inicial.

Producción:

viewchild en angular con el resultado de la consola directiva

El resultado anterior muestra que el componente principal podría acceder al valor de la directiva usando @ViewChild.

Use el ViewChild con elementos DOM en Angular

Revisaremos los Elementos DOM y accederemos a ellos usando @ViewChild en este ejemplo. @ViewChild nos permite acceder a los elementos DOM nativos con una variable de referencia de plantilla.

Vamos a crear una nueva aplicación usando el siguiente comando.

# angular
ng new my-app

Después de crear nuestra nueva aplicación en angular, iremos a nuestro directorio de aplicaciones usando este comando.

# angular
cd my-app

Ahora, ejecutemos nuestra aplicación para verificar si todas las dependencias están instaladas correctamente.

# angular
ng serve --open

Por ejemplo, tenemos una etiqueta de entrada en app.component.html con la variable de referencia #forViewChild que se muestra a continuación en el código.

# Angular
<input #forViewChild placeholder="Your favorite Programming Language">

También agregaremos algo de CSS en app.component.css.

# Angular
p {
  font-family: Lato;
}
input {
  padding: 5px 10px;
}
label {
  font-size: 20px;
  padding-right: 10px;
}

Producción:

viewchild en angular con elemento DOM

Ahora, podemos acceder a la entrada con @ViewChild y establecer el valor. Nuestro código en app.component.ts se verá a continuación.

# angular
import { Component, ViewChild, AfterViewInit, ElementRef } from '@angular/core';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent implements AfterViewInit {
  @ViewChild('forViewChild') forViewChild!: ElementRef;
  ngAfterViewInit() {
    this.forViewChild.nativeElement.value = 'Angular!';
  }
}

Entonces, cuando se ejecuta ngAfterViewInit, el valor de entrada se cambiará y se establecerá en Angular! como se muestra en el siguiente ejemplo.

Producción:

viewchild en angular con valor de conjunto de elementos DOM

Como puede ver en el ejemplo anterior, el componente principal establece el valor del elemento DOM secundario usando @ViewChild.

Use el ViewChild con componentes secundarios en Angular

Con @ViewChild, podemos acceder a un componente secundario y llamar a métodos o variables de instancia disponibles para el elemento secundario. Ahora veremos un ejemplo para comprender cómo podemos usar @ViewChild con componentes secundarios en Angular.

Vamos a crear una nueva aplicación usando el siguiente comando.

# angular
ng new my-app

Después de crear nuestra nueva aplicación en angular, iremos a nuestro directorio de aplicaciones usando este comando.

# angular
cd my-app

Ahora, ejecutemos nuestra aplicación para verificar si todas las dependencias están instaladas correctamente.

# angular
ng serve --open

Ahora, vamos a crear un nuevo componente como HelloComponent.

Podemos crear un nuevo componente de dos maneras. Usando un @angular/cli y ejecutando el siguiente comando.

# Angular
ng generate component hello --flat --skip-tests

Con este comando, se crearán los archivos hello.component.ts, hello.component.html y hello.component.css. O podemos crear estos archivos manualmente.

Ahora, en app.module.ts, necesitamos agregar el componente recién creado. Nuestro código en app.module.ts se verá a continuación.

# Angular
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';

import { AppComponent } from './app.component';
import { HelloComponent } from './hello.component';

@NgModule({
  imports:      [ BrowserModule, FormsModule ],
  declarations: [ AppComponent, HelloComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }

Agregaremos un método GreetingMessage a HelloComponent para devolver un mensaje.

# Angular
import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'hello',
  templateUrl: './hello.component.html',
  styleUrls: ['./hello.component.css'],
})
export class HelloComponent implements OnInit {
  constructor() {}

  GreetingMessage() {
    return 'Hello Member!';
  }

  ngOnInit(): void {}
}

Ahora, haremos referencia al componente hijo en app.component.html usando <hello>. Entonces, nuestro código se verá como a continuación.

# Angular
<hello>It Works</hello>

Llamaremos al método GreetingMessage desde la clase del componente padre app.component.ts con @ViewChild. Entonces, nuestro código se verá como a continuación.

# Angular
import { Component, ViewChild, AfterViewInit } from '@angular/core';
import { HelloComponent } from './hello.component';

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
})
export class AppComponent {
  @ViewChild(HelloComponent) hello!: HelloComponent;

  ngAfterViewInit() {
    console.log(this.hello.GreetingMessage());
  }
}

Producción:

viewchild en angular con componente secundario

Este tutorial nos enseñó cómo usar @ViewChild en diferentes situaciones con ejemplos.

¿Disfrutas de nuestros tutoriales? Suscríbete a DelftStack en YouTube para apoyarnos en la creación de más guías en vídeo de alta calidad. Suscríbete
Rana Hasnain Khan avatar Rana Hasnain Khan avatar

Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.

LinkedIn