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í.