Skip to content

Query Filters ​

Так само відомі як "старі фільтри".

Як працюють старі фільтри? ​

Query Controller Mixin ​

Є міксин, який керує router'ом. Все вертиться навколо нього (міксина, власне).

Filter mixins ​

Є міксини фільтрів, в задачу яких входить відновлення стану фільтрації з роута, а також set параметрів у store. Вони наслідують міксин роутера.

Filter components ​

Є компоненти (селекти, наприклад), які використовують міксини фільтрів. Вони використовують свої міксини, які є обгортками над двома попередніми, з відповідним функціоналом: відновити дані, потягти дані з сервера, якщо це API-select.

Можна скористатись цим компонентом, а можна імпортувати міксини напряму - і написати свій кастомний фільтр.

Store ​

Є стор, у якому описуються схеми фільтрів, та в нього кладуться дані з компонентів - через міксини, знов таки.

Є набір класів фільтрів, які форсять дефолтну схему певного фільтра за його типом (дефолт, єнам, апі).

Watcher у компоненті таблиці ​

Компонент таблиці watch'ить router.query, і, коли він змінився - викликає перезавантаженя ліста.

GET_FILTERS ​

У перезавантаженні ліста викликається метод, який агрегує значення фільтрів зі стор модуля, та надсилає їх.

Все це виглядає приблизно так:

Hint: "Open image in new tab" for better view.

Тут ми бачимо декілька "центрів тяжіння":

  • З одного боку, це router controller mixin, який взаємодіє з router,
  • А з іншого, це компонент таблиці, який "дивиться" на router і запускає перезавантаження даних.

Які ж проблеми виникали? ​

Суто архітектурна. ​

Як правило, стор має керувати апплікейшеном, містити в собі всю heavy логіку. Тут же стор фільтрів є просто додатком, а основний контроль покладається на міксини.

Кожен компонент містить в собі міксин, який самостійно керує роутером. ​

Через це, немає єдиної "точки входу" в роутер, а отже, важко підписатись на цю подію, чи зробити до неї якісь централізовані хуки або міддлвару.

Batch update ​

Через попередню причину, виникає проблема просто в тому, щоб оновити одночасно 2 параметри, при цьому, не викликаючи перезавантаження даних на кожну зміну: наприклад, оновлюється один фільтр, а нам після його оновлення треба скинути пейджу. Як? А ніяк: вотчером на роутер? - побіжить 2 запити. А перехопити зміну фільтра і додати якусь додаткову логіку можливості немає.

Неявна залежність між оновленням фільтрів та перезавантаженням даних. ​

Вотчер на роутер.квері можна забути написати. Немає зручної можливості перебирати, що змінилось, і все таке. Більше того: у нас проблеми з тим, щоб визначити джерело істиності фільтра: кверя роутера, яка є основним контролюючим елементом схеми, або роутер - який концептуально мав би бути основним?

Наше улюблене: міксин в міксині, в міксині. Ням-ням. ​

Отже, виходить, що старі фільтри виглядають доволі складними, неочевидними та заплутаними через перевертання керуючих компонентів, а також через неможливість задовільнити вимогу скидати пейджу, коли оновлюється фільтр.

Як працюють нові фільтри? ​

Детально, Filters