Angular

Angular

Tutorial Angular: Comunicación entre componentes Angular

Angular: comunicación entre componentes con @Input y @Output. Aprende a intercambiar datos entre componentes en Angular utilizando las propiedades @Input y @Output para una interacción eficiente.

La comunicación entre componentes es esencial en las aplicaciones Angular para mantener la coherencia y la actualización de datos entre diferentes partes de la aplicación.

En Angular, existen varias técnicas para lograr esta comunicación entre componentes, y se pueden dividir en dos categorías principales: comunicación entre componentes relacionados y comunicación entre componentes no relacionados.

Comunicación entre componentes relacionados

Comunicación mediante propiedades (@Input())

Los componentes pueden intercambiar información pasando datos a través de propiedades, también conocido como "binding" en Angular.

Un componente puede enviar datos a otro componente utilizando la propiedad de entrada @Input().

Por ejemplo, supongamos que hay un componente UsuarioComponent que muestra detalles de un usuario:

// En UsuarioComponent
import { Component, Input } from '@angular/core';

@Component({
  selector: 'app-usuario',
  standalone: true,
  template: `
    @if (usuario) {
      <div>
        <h2>{{ usuario.nombre }}</h2>
        <p>{{ usuario.descripcion }}</p>
      </div>
    }
  `
})
export class UsuarioComponent {
  @Input() usuario?: Usuario;
}

Para usar este componente en otro componente, simplemente se enlaza la propiedad usuario:

@Component({
  selector: 'app-contenedor',
  standalone: true,
  imports: [UsuarioComponent],
  template: `
    <app-usuario [usuario]="usuarioActual" />
  `
})
export class ContenedorComponent {
  usuarioActual: Usuario = { nombre: 'Ana', descripcion: 'Desarrolladora' };
}

Comunicación mediante eventos (@Output())

Los componentes pueden comunicarse enviando eventos utilizando propiedades de salida.

Un componente emisor puede lanzar un evento utilizando la propiedad de salida @Output(), generalmente utilizando la clase EventEmitter, que puede ser escuchada por otro componente.

Por ejemplo, consideremos un componente ContadorComponent que permite al usuario aumentar un contador y notificar a otros componentes cuando cambia:

import { Component, Output, EventEmitter } from '@angular/core';

@Component({
  selector: 'app-contador',
  standalone: true,
  template: `
    <button (click)="aumentarContador()">Aumentar</button>
  `
})
export class ContadorComponent {
  contador = 0;
  @Output() cambioContador = new EventEmitter<number>();

  aumentarContador() {
    this.contador++;
    this.cambioContador.emit(this.contador);
  }
}

En el componente que utiliza ContadorComponent:

@Component({
  selector: 'app-contenedor',
  standalone: true,
  imports: [ContadorComponent],
  template: `
    <app-contador (cambioContador)="actualizarContador($event)" />
    <p>Contador actual: {{ contadorActual }}</p>
  `
})
export class ContenedorComponent {
  contadorActual = 0;

  actualizarContador(nuevoValor: number) {
    this.contadorActual = nuevoValor;
  }
}

Proyección de contenido

La proyección de contenido utiliza la etiqueta <ng-content> para insertar contenido dinámico en un componente desde su componente padre.

@Component({
  selector: 'app-mi-componente',
  standalone: true,
  template: `
    <div class="contenedor">
      <ng-content select="[header]"></ng-content>
      <ng-content select="[content]"></ng-content>
    </div>
  `
})
export class MiComponenteComponent {}

Uso en el componente padre:

@Component({
  selector: 'app-contenedor',
  standalone: true,
  imports: [MiComponenteComponent],
  template: `
    <app-mi-componente>
      <h3 header>Título personalizado</h3>
      <p content>Contenido personalizado</p>
    </app-mi-componente>
  `
})
export class ContenedorComponent {}

Comunicación entre componentes no relacionados

Servicios compartidos

Los servicios son instancias compartidas que permiten la comunicación entre componentes que no están directamente relacionados. 

La inyección de dependencias es el mecanismo mediante el cual se proporcionan estas instancias a los componentes que las necesitan.

Un servicio puede tener métodos para almacenar y recuperar datos, lo que facilita el intercambio de información entre componentes.

Por ejemplo, un UsuarioService podría proporcionar información de usuario a diferentes partes de la aplicación:

// En UsuarioService
import { Injectable, signal, computed } from '@angular/core';
import { Usuario } from './usuario.model';

@Injectable({
  providedIn: 'root'
})
export class UsuarioService {
 
 usuarioActual: Usuario; // Suponiendo que Usuario es una interfaz o clase

 constructor() {
     this.usuarioActual = {
         id: 1,
         nombre: 'Usuario Ejemplo',
         correo: 'usuario@example.com'
     };
 }

 actualizarUsuario(usuarioNuevo: Usuario) {
 this.usuarioActual = usuarioNuevo;
 }

 obtenerUsuario(): Usuario {
 return this.usuarioActual;
 }
}

Mediante la inyección de dependencias, un componente puede acceder al servicio en su constructor:

// En cualquier componente
import { Component } from '@angular/core';
import { UsuarioService } from './usuario.service'; // Importar el servicio

@Component({
 selector: 'app-mi-componente',
 templateUrl: './mi-componente.component.html',
 styleUrls: ['./mi-componente.component.css']
})
export class MiComponenteComponent {

 usuario: Usuario; // Suponiendo que Usuario es una interfaz o clase

 constructor(private usuarioService: UsuarioService) {
     // El servicio UsuarioService se inyecta en el constructor
     this.usuario = this.usuarioService.usuarioActual;
 }
}
Certifícate en Angular con CertiDevs PLUS

Ejercicios de esta lección Comunicación entre componentes Angular

Evalúa tus conocimientos de esta lección Comunicación entre componentes Angular con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Signals en Angular

Angular
Puzzle

Guards funcionales

Angular
Test

Decodificar JWT en Angular

Angular
Test

Servicio con HttpClient

Angular
Código

Ciclo de vida de componentes en Angular

Angular
Test

Gestión de productos de Fake Store API

Angular
Proyecto

Data binding en Angular

Angular
Test

Routes sin módulos en Angular

Angular
Código

Router en Angular

Angular
Test

Instalación de Angular

Angular
Puzzle

Route Guards basados en interfaces

Angular
Código

La directiva @if en Angular

Angular
Puzzle

Formularios reactivos en Angular

Angular
Código

Servicios en Angular

Angular
Puzzle

Interceptor funcional

Angular
Test

Servicio con Array

Angular
Código

La directiva @for en Angular

Angular
Puzzle

Interceptores HTTP

Angular
Código

Componentes standalone true

Angular
Puzzle

Formularios con ngModel en Angular

Angular
Puzzle

Routes en Angular

Angular
Test

Comunicación entre componentes Angular

Angular
Test

Parámetros en rutas con ActivatedRoute

Angular
Test

CRUD de Restaurantes y Platos

Angular
Proyecto

Tablas en Angular Material

Angular
Puzzle

Formulario de registro de usuarios

Angular
Proyecto

Instalación y uso de NgBoostrap

Angular
Puzzle

Desarrollo de componentes Angular

Angular
Test

JWT en Angular

Angular
Código

Formularios reactivos en Angular

Angular
Puzzle

Formularios en Angular Material

Angular
Puzzle

Layout con Angular Material

Angular
Puzzle

Effects en Angular

Angular
Test

Data binding

Angular
Código

HttpClient en servicios de Angular

Angular
Puzzle

Desarrollo de módulos Angular

Angular
Puzzle

Comandos Angular CLI

Angular
Puzzle

Subir archivo en formularios

Angular
Test

La directiva routerLink en Angular

Angular
Test

Todas las lecciones de Angular

Accede a todas las lecciones de Angular y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Instalación Angular

Angular

Introducción Y Entorno

Comandos Angular Cli

Angular

Introducción Y Entorno

Desarrollo De Componentes Angular

Angular

Componentes

Data Binding En Angular

Angular

Componentes

Ciclo De Vida De Componentes En Angular

Angular

Componentes

Comunicación Entre Componentes Angular

Angular

Componentes

La Directiva @If En Angular

Angular

Componentes

La Directiva @For En Angular

Angular

Componentes

Componentes Standalone

Angular

Componentes

Desarrollo De Módulos Angular

Angular

Módulos

Routes En Angular

Angular

Enrutado Y Navegación

Router En Angular

Angular

Enrutado Y Navegación

La Directiva Routerlink En Angular

Angular

Enrutado Y Navegación

Parámetros En Rutas Con Activatedroute

Angular

Enrutado Y Navegación

Routes Sin Módulos En Angular

Angular

Enrutado Y Navegación

Servicios En Angular

Angular

Servicios E Inyección De Dependencias

Httpclient En Servicios De Angular

Angular

Servicios E Inyección De Dependencias

Formularios Con Ngmodel En Angular

Angular

Formularios

Formularios Reactivos En Angular

Angular

Formularios

Subir Archivo En Formularios

Angular

Formularios

Layout Con Angular Material

Angular

Integración Con Angular Material

Tablas En Angular Material

Angular

Integración Con Angular Material

Formularios En Angular Material

Angular

Integración Con Angular Material

Instalación Y Uso De Ngboostrap

Angular

Integración Con Bootstrap Css

Signals En Angular

Angular

Signals Y Reactividad

Effects En Angular

Angular

Signals Y Reactividad

Route Guards Basados En Interfaces

Angular

Autenticación Y Autorización

Guards Funcionales

Angular

Autenticación Y Autorización

Interceptores Http Basados En Interfaz

Angular

Autenticación Y Autorización

Interceptores Http Funcionales

Angular

Autenticación Y Autorización

Seguridad Jwt En Angular

Angular

Autenticación Y Autorización

Decodificar Tokens Jwt En Angular

Angular

Autenticación Y Autorización

Certificados de superación de Angular

Supera todos los ejercicios de programación del curso de Angular y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  1. Comprender la importancia de la comunicación entre componentes en Angular.
  2. Distinguir entre comunicación entre componentes relacionados y no relacionados.
  3. Dominar el uso de propiedades y eventos para comunicación entre componentes.
  4. Aprender a utilizar servicios compartidos para comunicación entre componentes.