Взаимодействие между компонентами Angular с использованием RxJS

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Руководство о том, как использовать Subject RxJS и BehaviourSubject RxJS для связи между компонентами Angular.


В этой статье я буду использовать RxJS, чтобы показать как компоненты взаимодействуют, когда они не знают друг друга или не имеют общих родительских / дочерних отношений.

Содержание:


  1. Проблема
  2. Способ 1: Транспорт событий
  3. Способ 2: Сервис-наблюдатель
  4. Применение

Проблема


Во многих фрэймворках, включая Angular, всегда возникает проблема взаимодействия компонентов, когда мы разделяем приложение на множество маленьких UI компонентов и привязываемся к родительскому элементу родительского элемента, чтобы слушать события.

В Angular мы используем Output() и Input(). В стандартных случаях этого достаточно, но когда нужно связать входящие данные и исходящие события с родительским компонентом, управление этим всем превращается в кошмар.

Нужно добавить кучу Input() и Output() ко многим уровням компонента – это требует больших усилий, рискованно и не всегда работает.

Одно из решений – использовать мэнеджер состояния – такой как Redux, NGRX или NGXS, чтобы помочь несвязанным компонентам обмениваться данными.

В этой статье я представлю два дополнительных способа для решения этой проблемы, не требующих использования дополнительных библиотек.

  1. Транспорт событий с использованием Subject.
  2. Сервис-наблюдатель с использованием Behavior Subject.

Чтобы продемонстрировать эти решения, я создам пример, в котором пользователь может щелкнуть элемент списка статей и отобразить подробности в другом компоненте.

Способ 1: Транспорт событий


Концепция очень проста. Вы создаёте сервис, события которого будут доступны везде.
Сервис распространяет события, а подписчики могут выполнить функцию обратного вызова, когда событие произошло. В этой статье я создам Транспорт событий с помощью RsJS Subject.

image

Каждый раз, когда пользователь нажимает на элемент списка статей, он генерирует событие и передает его с помощью Транспорта событий.

image

Этот код означает, что мы отправляем событие SelectArticleDetail вместе с информацией о статье.

image

Слушатель прослушает SelectArticleDetail и выполнит обратный вызов, передаст данные статьи в локальную переменную и отобразит их в пользовательском интерфейсе.

Способ 2: Сервис-наблюдатель


Идея в том, чтобы просто создать способ для передачи данных изнутри. То есть каждый раз при изменении какого-то значения наблюдатель узнает об этом и выполняет функцию обратного вызова.

image

Каждый раз, когда пользователь нажимает на элемент списка, он добавляет статью в хранилище.

image

Теперь, в компоненте детали, мы подпишемся на обновление хранилища, чтобы получить новое значение.

Применение


Я применял эти подходы во многих проектах. Вот несколько примеров, где это очень уместно:

  1. Транспорт событий: Я хочу использовать одно и то же модальное окно, чтобы показывать пользователю информацию о состоянии приложения каждый раз, когда он нажимает на кнопку
  2. Транспорт событий: Если используется моно-репозиторий с несколькими фрэймворками, удобно использовать этот подход для обмена событиями между фрэймворками или распространить событие от Angular к нативному JavaScript
  3. Транспорт событий и Сервис-наблюдатель для вложенных компонентов: сложно, используя Input() и Output() связать входящие/исходящие данные и события UI компонента D с UI компонентом B, c UI компонентом С и c родительским компонентом А при взаимодействии с API

Если у вас есть больше примеров, буду рад узнать о них. Учиться у других — отличный способ совершенствоваться.

Подводя итог


Эта статья о двух способах взаимодействия между двумя или более несвязанными компонентами.

Мы используем Сервис-наблюдатель, чтобы подписаться на данные для простых случаев, и используем Транспорт событий, чтобы отправлять разные события разным слушателям.

Надеюсь, статья была полезна! Подписывайтесь на меня в Medium и Twitter. Не стесняйтесь комментировать и задавать вопросы. Буду рад помочь!
Источник: https://habr.com/ru/post/471100/


Интересные статьи

Интересные статьи

6 и 7 ноября в Украине пройдет международная конференция Devoxx — одно из самых популярных событий, посвященных Java. Также традиционно на Devoxx обсуждаются и другие темы мира разработки...
Вы наверняка знаете, что мир процессоров разбит на два лагеря. Если вы смотрите это видео со смартфона, то для вас работает процессор на архитектуре ARM, а если с ноутбука, для вас тр...
Кто бы что ни говорил, но я считаю, что изобретение велосипедов — штука полезная. Использование готовых библиотек и фреймворков, конечно, хорошо, но порой стоит их отложить и создать ...
Новый сервис WebWormHole работает как портал, через который файлы передаются с компьютера на другой. Нажимаете кнопку New Wormhole — и получаете код для входа. Человек с другой стороны вводит...
Рендеринг диаграмм может серьёзно нагрузить работой браузер. Особенно если речь идёт о выводе в интерфейсе сложного приложения множества элементов, представляющих диаграммы. Попытаться улучшить с...