Пользовательский оператор RxJS для использования с NgRx

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

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

Это означает, что для каждого select магазина нам необходимо:

Было бы здорово сгруппировать и select, и takeUntil, верно? Мы можем добиться этого, написав собственный оператор RxJS, например:

Обратной стороной является то, что для его использования нам все равно нужно определить уничтоженный компонент (Subject), вызвать для него next и complete:

Если бы мы могли найти способ обернуть это Subject творение, takeUntil, и прослушать ngOnDestroy компонента для запуска next и complete, это было бы здорово. Вот где в игру вступает ngneat / until-destroy. Они предоставляют настраиваемого оператора, который делает именно то, что нам нужно.

Объединив untilDestroy с нашим пользовательским оператором и добавив объявление ожидаемого типа, мы можем получить следующее:

Где мы это используем:

Примечание. Если вы используете View Engine, используйте ngx-until-destroy. Разница в том, что если у вас нет @UntilDestroy() декоратора и вам нужно написать свой ngOnDestroy, он может быть пустым.

Заключение

Вот и все! Быстрый и простой способ уменьшить шаблон, создав собственный оператор RxJS.

Я надеюсь, что это помогает.