Domina la comunicación entre componentes en Angular: Guía completa

Introducción La arquitectura de Angular se basa fundamentalmente en componentes: pequeñas piezas independientes que, al unirse, forman aplicaciones robustas y escalables. Sin embargo, esta independencia plantea una pregunta crucial: ¿cómo lograr que estos componentes se comuniquen entre sí? En este artículo, exploraremos en profundidad los diferentes mecanismos que Angular ofrece para la comunicación entre componentes, desde las relaciones padre-hijo hasta comunicaciones entre componentes no relacionados jerárquicamente. No solo aprenderás los conceptos teóricos, sino que también verás ejemplos prácticos que podrás implementar en tus propios proyectos. Índice de contenidos Comunicación de padre a hijo Comunicación de hijo a padre Comunicación entre componentes hermanos Comunicación mediante servicios Gestión de estado con NgRx Buenas prácticas y patrones comunes Errores comunes y cómo evitarlos Conclusiones Comunicación de padre a hijo La comunicación de padre a hijo es probablemente la forma más intuitiva y directa de comunicación entre componentes en Angular. Esta se realiza mediante el uso de @Input(). ¿Qué es @Input()? El decorador @Input() permite que un componente hijo reciba datos desde su componente padre. Es unidireccional, lo que significa que los datos fluyen en una sola dirección: desde el padre hacia el hijo. Implementación paso a paso 1. Definir la propiedad en el componente hijo Primero, necesitamos definir qué datos queremos recibir en nuestro componente hijo: // hijo.component.ts import { Component, Input } from '@angular/core'; @Component({ selector: 'app-hijo', templateUrl: './hijo.component.html', styleUrls: ['./hijo.component.css'] }) export class HijoComponent { @Input() mensaje: string = ''; @Input() datos: any[] = []; } 2. Usar la propiedad en la plantilla del hijo Ahora podemos utilizar estas propiedades en la plantilla del componente hijo: Mensaje recibido del padre: {{ mensaje }} Datos recibidos del padre: {{ item.nombre }} 3. Pasar los datos desde el componente padre Finalmente, desde el componente padre, pasamos los valores al componente hijo: Componente Padre Cambiar mensaje Y en el componente TypeScript del padre: // padre.component.ts import { Component } from '@angular/core'; @Component({ selector: 'app-padre', templateUrl: './padre.component.html', styleUrls: ['./padre.component.css'] }) export class PadreComponent { mensajeParaHijo: string = '¡Hola desde el componente padre!'; datosParaHijo: any[] = [ { id: 1, nombre: 'Elemento 1' }, { id: 2, nombre: 'Elemento 2' }, { id: 3, nombre: 'Elemento 3' } ]; cambiarMensaje() { this.mensajeParaHijo = 'Mensaje actualizado: ' + new Date().toLocaleTimeString(); } } Inputs con alias A veces, puede ser útil tener un nombre interno para la propiedad diferente al que se usa externamente. Para esto, Angular permite definir un alias para el @Input(): @Input('nombreExterno') nombreInterno: string = ''; Esto permite usar nombreExterno en la plantilla del padre mientras se trabaja con nombreInterno dentro del componente hijo. Transformación de inputs con setters Si necesitas realizar alguna transformación o validación cuando un input cambia, puedes utilizar un setter: private _mensaje: string = ''; @Input() set mensaje(valor: string) { this._mensaje = valor ? valor.toUpperCase() : ''; } get mensaje(): string { return this._mensaje; } De esta manera, cuando el padre cambie el valor del input, el setter se ejecutará y transformará el valor (en este caso, a mayúsculas) antes de almacenarlo. Comunicación de hijo a padre La comunicación en dirección opuesta, desde el hijo hacia el padre, se realiza mediante eventos utilizando el decorador @Output() junto con EventEmitter. ¿Qué es @Output() y EventEmitter? @Output() es un decorador que define una propiedad como un canal por donde se emitirán eventos. EventEmitter es una clase que implementa el patrón Observable y permite emitir eventos personalizados. Implementación paso a paso 1. Definir el Output en el componente hijo // hijo.component.ts import { Component, Output, EventEmitter } from '@angular/core'; @Component({ selector: 'app-hijo', templateUrl: './hijo.component.html', styleUrls: ['./hijo.component.css'] }) export class HijoComponent { @Output() accionRealizada = new EventEmitter(); @Output() datosEnviados = new EventEmitter(); mensajeParaPadre: string = ''; enviarMensaje() { this.accionRealizada.emit(this.mensajeParaPadre); } enviarDatos() { const datos = { fecha: new Date(), usuario: 'Usuario1', accion: 'Acción completada' }; this.datosEnviados.emit(datos); } } 2. Agregar controles en la plantilla del hijo

Mar 6, 2025 - 20:35
 0
Domina la comunicación entre componentes en Angular: Guía completa

Introducción

La arquitectura de Angular se basa fundamentalmente en componentes: pequeñas piezas independientes que, al unirse, forman aplicaciones robustas y escalables. Sin embargo, esta independencia plantea una pregunta crucial: ¿cómo lograr que estos componentes se comuniquen entre sí?

En este artículo, exploraremos en profundidad los diferentes mecanismos que Angular ofrece para la comunicación entre componentes, desde las relaciones padre-hijo hasta comunicaciones entre componentes no relacionados jerárquicamente. No solo aprenderás los conceptos teóricos, sino que también verás ejemplos prácticos que podrás implementar en tus propios proyectos.

Índice de contenidos

  1. Comunicación de padre a hijo
  2. Comunicación de hijo a padre
  3. Comunicación entre componentes hermanos
  4. Comunicación mediante servicios
  5. Gestión de estado con NgRx
  6. Buenas prácticas y patrones comunes
  7. Errores comunes y cómo evitarlos
  8. Conclusiones

Comunicación de padre a hijo

La comunicación de padre a hijo es probablemente la forma más intuitiva y directa de comunicación entre componentes en Angular. Esta se realiza mediante el uso de @Input().

¿Qué es @Input()?

El decorador @Input() permite que un componente hijo reciba datos desde su componente padre. Es unidireccional, lo que significa que los datos fluyen en una sola dirección: desde el padre hacia el hijo.

Implementación paso a paso

1. Definir la propiedad en el componente hijo

Primero, necesitamos definir qué datos queremos recibir en nuestro componente hijo:

// hijo.component.ts
import { Component, Input } from '@angular/core';

@Component({
  selector: 'app-hijo',
  templateUrl: './hijo.component.html',
  styleUrls: ['./hijo.component.css']
})
export class HijoComponent {
  @Input() mensaje: string = '';
  @Input() datos: any[] = [];
}

2. Usar la propiedad en la plantilla del hijo

Ahora podemos utilizar estas propiedades en la plantilla del componente hijo:


 class="mensaje-recibido">
  

Mensaje recibido del padre:

{{ mensaje }}

class="datos-recibidos">

Datos recibidos del padre:

    *ngFor="let item of datos">{{ item.nombre }}