View Child en Angular

Rana Hasnain Khan 23 mayo 2022
  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.

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