En el concepto anterior vimos al final como podemos pasar un dato mediante el 'property binding' (la variable 'valor1' se encuentra definida en la clase):
<app-dado [valor]="valor1"></app-dado>
Ahora veremos como podemos captura un evento en la componente padre que emite la componente hija:
<app-cronometro [inicio]="15" (multiplo10)="actualizar($event)"></app-cronometro>
En esta componente tenemos una propiedad llamada inicio que le enviamos un dato y capturamos un evento llamado 'multiplo10' que emite la componente app-cronometro.
Confeccionar una aplicación con dos componentes llamadas 'AppComponent' y 'CronometroComponent'. La componente 'CronometroComponent' muestra un cronómetro que se actualiza cada un segundo, cada vez que su valor es múltiplo de 10 informa a la componente padre de dicha situación informando el segundo actual.
La componente 'AppComponent' define un cronómetro e informa cada vez que el cronómetro tiene un valor múltiplo de 10.
Desde la línea de comandos de Node.js procedemos a crear el proyecto005:
f:\angularya> ng new proyecto005
Primero descendemos a la carpeta proyecto005 y nuevamente desde la línea de comandos procedemos a crear la componente 'cronometro' escribiendo:
f:\angularya\proyecto005> ng generate component cronometro
Recordemos que al ejecutar este comando se crean 4 archivos y se modifica uno.
Además dentro de la carpeta 'app' se crea una carpeta llamada 'cronometro' y dentro de ella se localizan los cuatro archivos creados.
El archivo que se modifica es 'app.module.ts' donde podemos comprobar que se importa la componente que acabamos de crear:
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppComponent } from './app.component'; import { CronometroComponent } from './cronometro/cronometro.component'; @NgModule({ declarations: [ AppComponent, CronometroComponent ], imports: [ BrowserModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
Es decir que ahora nuestro módulo tiene 2 componentes:
declarations: [ AppComponent, CronometroComponent ],
En nuestro tercer paso vamos a implementar la vista de la componente 'cronometro' y su modelo. Abrimos el archivo 'cronometro.component.ts' y codificamos:
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; @Component({ selector: 'app-cronometro', templateUrl: './cronometro.component.html', styleUrls: ['./cronometro.component.css'] }) export class CronometroComponent implements OnInit { segundo=0; @Input() inicio: number=0; @Output() multiplo10 = new EventEmitter(); constructor() { } ngOnInit() { this.segundo = this.inicio; setInterval(() => { this.segundo++; if (this.segundo % 10 == 0) this.multiplo10.emit(this.segundo); }, 1000); } }
En la clase CronometroComponent podemos identificar la sintaxis para definir un evento:
@Output() multiplo10 = new EventEmitter();
Para definir el decorador @Output() debemos importar:
import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
Codificamos ahora el archivo 'cronometro.component.html':
<div class="cronometro"> {{segundo}} Seg. </div>
Para definir la hoja de estilo del 'cronometro' abrimos el archivo 'cronometro.component.css' y codificamos:
.cronometro { width: 8rem; height: 3rem; font-size: 2rem; color:white; background-color: black; border-radius: 10px; display: inline-flex; justify-content: center; align-items: center; margin:10px; }
Abrimos ahora el archivo 'app.component.html' y remplazamos su contenido con la definición de un cronometro y un mensaje que se muestra mediante interpolación:
<div style="text-align:center"> <h1>Prueba de la componente cronometro</h1> <app-cronometro [inicio]="15" (multiplo10)="actualizar($event)"></app-cronometro> <h2>Evento</h2> <h3>{{mensaje}}</h3> </div>
Ahora codificamos la clase AppComponent donde definimos el método que captura el evento emitido por el cronómetro:
import { Component } from '@angular/core'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'] }) export class AppComponent { mensaje=''; actualizar(t: number) { this.mensaje = t + '(se actualiza cada 10 segundos)'; } }
Si ejecutamos ahora el proyecto:
ng server -o
Podemos ver que cada vez que el cronómetro tiene un valor múltiplo de 10 la componente principal actualiza un mensaje gracias al evento que emite la componente 'cronometro':
Podemos probar esta aplicación en la web aquí.