Ir al contenido principal

Compartir Información Entre Componentes Usando Observables en Angular

Comunicación Entre Componentes en Angular con Observables

Este tutorial enseña cómo implementar la comunicación entre componentes en Angular utilizando observables. Se centrará en un sistema de gestión de perfiles de usuario, donde un componente principal interactúa con otros para ver o actualizar perfiles de usuario.

Pre-requisitos

Antes de empezar, asegúrate de tener lo siguiente instalado:

  • Angular CLI
  • Node.js
  • Un editor de código como Visual Studio Code

Estructura del Proyecto

Vamos a trabajar con tres componentes principales:

  1. AdminUsuarioComponent: Administra la interacción general y muestra la lista de usuarios.
  2. TablaListUsuarioComponent: Muestra los usuarios en una tabla.
  3. PerfilUsuarioComponent: Permite ver y editar el perfil de un usuario.

También utilizaremos un servicio ListenerAdminUsuarioService para facilitar la comunicación entre los componentes.

Paso 1: Crear el Servicio de Comunicación

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { Usuario } from '@interfaces/agregar-dependencia-us/agregar-dependencia-us';

@Injectable({
  providedIn: 'root'
})
export class ListenerAdminUsuarioService {
  private usuarioMenuOpcionIdSource = new BehaviorSubject<{usuario: Usuario, menuOpcionId: string}>(null);

  getUsuarioMenuOpcionId() {
    return this.usuarioMenuOpcionIdSource.asObservable();
  }

  setUsuarioMenuOpcionId(data: {usuario: Usuario, menuOpcionId: string}) {
    this.usuarioMenuOpcionIdSource.next(data);
  }
}

Paso 2: Implementar el AdminUsuarioComponent

import { Component, OnInit } from '@angular/core';
import { Usuario } from '@interfaces/agregar-dependencia-us/agregar-dependencia-us';
import { ListenerAdminUsuarioService } from '../listener-admin-usuario/listener-admin-usuario.service';

@Component({
  selector: 'app-admin-usuario',
  templateUrl: './admin-usuario.component.html'
})
export class AdminUsuarioComponent implements OnInit {
  users: Usuario[] = [...]; // Supongamos que aquí están los datos de los usuarios.

  constructor(private listenerAdminUsuarioService: ListenerAdminUsuarioService) {}

  ngOnInit() {
    this.listenerAdminUsuarioService.getUsuarioMenuOpcionId().subscribe(data => {
      if (data) {
        console.log("Acción recibida:", data.menuOpcionId);
        // Realizar acciones basadas en el menú y el usuario seleccionado.
      }
    });
  }
}

Paso 3: Implementar el TablaListUsuarioComponent

import { Component, Input } from '@angular/core';
import { Usuario } from '@interfaces/agregar-dependencia-us/agregar-dependencia-us';
import { ListenerAdminUsuarioService } from '../listener-admin-usuario/listener-admin-usuario.service';

@Component({
  selector: 'app-tabla-list-usuario',
  templateUrl: './tabla-list-usuario.component.html'
})
export class TablaListUsuarioComponent {
  @Input() users: Usuario[];

  constructor(private listenerAdminUsuarioService: ListenerAdminUsuarioService) {}

  selectUser(usuario: Usuario) {
    this.listenerAdminUsuarioService.setUsuarioMenuOpcionId({
      usuario: usuario,
      menuOpcionId: 'opcion-perfil-us'
    });
  }
}

Paso 4: Implementar el PerfilUsuarioComponent

import { Component, OnInit } from '@angular/core';
import { ListenerAdminUsuarioService } from '../listener-admin-usuario/listener-admin-usuario.service';
import { Usuario } from '@interfaces/agregar-dependencia-us/agregar-dependencia-us';

@Component({
  selector: 'app-perfil-usuario',
  templateUrl: './perfil-usuario.component.html'
})
export class PerfilUsuarioComponent implements OnInit {
  usuario: Usuario;

  constructor(private listenerAdminUsuarioService: ListenerAdminUsuarioService) {}

  ngOnInit() {
    this.listenerAdminUsuarioService.getUsuarioMenuOpcionId().subscribe(data => {
      if (data && data.menuOpcionId === 'opcion-perfil-us') {
        this.usuario = data.usuario;
        this.openModal();
      }
    });
  }

  openModal() {
    // Lógica para abrir el modal de perfil
  }

  closeModal() {
    // Lógica para cerrar el modal
  }
}

Puedes guiarte también de este video donde muestra el uso de observables:

https://www.youtube.com/watch?v=96HouMe0o5M

Conclusión

Este tutorial demuestra cómo utilizar observables y servicios para facilitar la comunicación entre componentes en una aplicación Angular, manteniendo el código limpio y modular, perfecto para gestionar perfiles de usuario.

Comentarios

Entradas populares de este blog

Los Iconos SVG en HTML

Los iconos SVG (Scalable Vector Graphics) son imágenes vectoriales escalables que se utilizan ampliamente en el desarrollo web, especialmente en HTML. A continuación, se presenta un artículo detallado sobre los iconos SVG y su uso en HTML, junto con sus ventajas y desventajas. Introducción a los iconos SVG SVG es un formato de imagen basado en vectores, lo que significa que se describe mediante ecuaciones matemáticas en lugar de píxeles. Esto permite que las imágenes SVG se escalen sin perder calidad, a diferencia de las imágenes de mapa de bits tradicionales como JPG, PNG o GIF. Los iconos SVG son ampliamente utilizados en el desarrollo web para representar elementos gráficos como logotipos, botones, iconos de navegación y otros elementos de interfaz de usuario. Estos iconos se pueden crear con herramientas de diseño vectorial como Adobe Illustrator, Inkscape o Sketch, y luego se incrustran directamente en el código HTML. Uso de iconos SVG en HTML Existen varias formas de incluir