Interacción entre componentes angulares usando RxJS

imagen


Una guía sobre cómo usar Subject RxJS y BehaviourSubject RxJS para comunicarse entre componentes angulares.

En este artículo, usaré RxJS para mostrar cómo interactúan los componentes cuando no se conocen o no tienen una relación padre / hijo común.

Contenido:


  1. El problema
  2. Método 1: transporte de eventos
  3. Método 2: Observador de servicio
  4. Solicitud

El problema


En muchos marcos, incluido Angular, el problema de la interacción de componentes siempre surge cuando dividimos la aplicación en muchos componentes pequeños de la interfaz de usuario y nos unimos al elemento padre del elemento padre para escuchar eventos.

En Angular, usamos Output () y Input (). En casos estándar, esto es suficiente, pero cuando necesita asociar datos entrantes y eventos salientes con el componente principal, administrar todo esto se convierte en una pesadilla.

Debe agregar un montón de Input () y Output () a muchos niveles del componente; esto requiere mucho esfuerzo, es arriesgado y no siempre funciona.

Una solución es utilizar un administrador de estado como Redux, NGRX o NGXS para ayudar a los componentes no relacionados a comunicarse.

En este artículo, presentaré dos formas adicionales de resolver este problema que no requieren el uso de bibliotecas adicionales.

  1. Transporte de eventos usando Asunto.
  2. Observador de servicio utilizando el sujeto de comportamiento.

Para demostrar estas soluciones, crearé un ejemplo en el que un usuario puede hacer clic en un elemento de la lista de artículos y mostrar los detalles en otro componente.

Método 1: transporte de eventos


El concepto es muy simple. Usted crea un servicio cuyos eventos estarán disponibles en todas partes.
El servicio distribuye eventos y los suscriptores pueden realizar una función de devolución de llamada cuando ocurre un evento. En este artículo, crearé un Transporte de eventos utilizando un Asunto RsJS.

imagen

Cada vez que un usuario hace clic en un elemento de la lista de artículos, genera un evento y lo transmite mediante el Transporte de eventos.

imagen

Este código significa que enviamos el evento SelectArticleDetail junto con la información del artículo.

imagen

El oyente escuchará SelectArticleDetail y realizará una devolución de llamada, transferirá los datos del artículo a una variable local y lo mostrará en la interfaz de usuario.

Método 2: Observador de servicio


La idea es simplemente crear una forma de transferir datos desde dentro. Es decir, cada vez que cambia un valor, el observador se entera de esto y realiza la función de una devolución de llamada.

imagen

Cada vez que un usuario hace clic en un elemento de la lista, agrega un artículo al repositorio.

imagen

Ahora, en el componente de parte, nos suscribiremos a la actualización del repositorio para obtener un nuevo valor.

Solicitud


He aplicado estos enfoques en muchos proyectos. Aquí hay algunos ejemplos donde esto es muy apropiado:

  1. Transporte de eventos: quiero usar la misma ventana modal para mostrar la información del usuario sobre el estado de la aplicación cada vez que hace clic en el botón
  2. Transporte de eventos: si está utilizando un mono-repositorio con varios marcos, es conveniente utilizar este enfoque para intercambiar eventos entre marcos o para distribuir un evento de Angular a JavaScript nativo
  3. Transporte de eventos y observador de servicio para componentes anidados: es difícil usar Input () y Output () para conectar datos entrantes / salientes y eventos de IU del componente D con el componente UI B, con el componente UI C y el componente C principal A al interactuar con la API

Si tiene más ejemplos, me alegrará saber de ellos. Aprender de los demás es una excelente manera de mejorar.

Para resumir


Este artículo trata sobre dos formas de interactuar entre dos o más componentes no relacionados.

Utilizamos el Observador de servicios para suscribirse a datos para casos simples y el Transporte de eventos para enviar diferentes eventos a diferentes oyentes.

¡Espero que el artículo haya sido útil! Sígueme en Medium y Twitter . Siéntase libre de comentar y hacer preguntas. Estaré encantado de ayudar!

Source: https://habr.com/ru/post/471100/


All Articles