Мы можем использовать декоратор ViewChildren
, чтобы получить QueryList
элементов или директив из представления DOM. В этой статье мы рассмотрим, как мы можем использовать эту технику, чтобы управлять фильтрами наших приложений многоразовым, эффективным и понятным способом.
Вот иллюстрация окончательного результата:
Представьте, что мы находимся на странице, которая отображает список ресурсов, и пользователи могут фильтровать список по ресурсу type
или по ресурсу level
.
Чтобы сообщить серверу, как фильтровать ресурс, мы будем использовать стиль строки запроса, в котором мы определяем текущие фильтры. Например:
https://api.com/resources?type=video&level=beginner
Наша цель:
Каждый раз, когда пользователь нажимает на фильтр, нам нужно получить последнее значение из каждого фильтра и создать новую строку запроса.
К счастью, у нас есть оператор Rx именно для такой функциональности - combineLatest
.
Сообщите мне, когда излучает какой-либо Observable, но также сообщите мне последнее значение от других. (Массив)
Давайте создадим компонент filters
. Это будет наша последняя разметка:
Интерфейсы
Интерфейс Filter
в основном предназначен для пользовательского интерфейса. ActiveFilter
предназначен для сервера. group
относится к ключу строки запроса, например:
https://api.com/resources?level=beginner
В URL-адресе about group
относится к level
.
Компонент фильтров
У нас есть два Inputs
, имя группы и массив фильтров.
Оператор combineLatest
ожидает получить список наблюдаемых. Нам нужно создать наблюдаемое, которое будет генерировать активный фильтр каждый раз, когда пользователь нажимает на фильтр.
Но есть одна загвоздка: нам нужно получить исходные данные, поэтому нам также нужно выдать значение из каждого на этапе инициализации компонента. Мы можем решить эту проблему с BehaviorSubject
.
BehaviorSubject
принимает начальное значение и немедленно передает его.
Нам нужно найти активный filter
из filters
Input; затем нам нужно создать наш BehaviorSubject
и испустить текущий фильтр id
с group
.
Теперь давайте проверим HTML и добавим событие click
.
Код прост, давайте перейдем к select()
методу, который будет запускаться каждый раз, когда пользователь нажимает на фильтр.
Нам нужно изменить состояние active
для каждого фильтра; тогда нам нужно создать новый активный filter
.
Компонент готов к использованию. Наконец самое интересное.
Теперь нам нужно получить наблюдаемое от каждого filters
компонента. Мы собираемся использовать декоратор ViewChildren
, чтобы получить компоненты фильтров из текущего представления.
Большой! Теперь у нас есть экземпляры фильтров, поэтому мы можем получить доступ к наблюдаемому changeFilter
. Последний шаг - использовать combineLatest
.
Каждый раз, когда один из фильтров выдает значение, мы собираемся получить массив, содержащий каждое значение фильтра, преобразовать их в строку запроса и отправить на наш сервер.
Это все.
Вы можете извлечь этот код в автономный модуль и использовать его.
Подпишитесь на меня в Medium или Twitter, чтобы узнать больше об Akita, Angular и JS!
👂🏻 И последнее, но не менее важное: слышали ли вы об аките?
Акита - это модель управления государством, которую мы разработали здесь, в Datorama. Он успешно используется в среде производства больших данных более семи месяцев, и мы постоянно добавляем в него функции.
Акита поощряет простоту. Он избавляет вас от хлопот по созданию шаблонного кода и предлагает мощные инструменты с умеренной кривой обучения, подходящие как для опытных, так и для неопытных разработчиков.
Я очень рекомендую это проверить.