Skip to content

Filter

Для определения полной логики фильтра тех или иных получаемых с api данных необходимо создать класс следующим образом:

ts
import Filter from "nuxoblivius/filter";

export default class FilterFilms extends Filter {
  protected static globalName = "FilterFilms";
  protected setup() {
    this.createFilter({
      name: this.type.string(),
      category: this.type.array(),
      rating: this.type.number(),
      hideNsfw: this.type.boolean(),
    });
    this.setDefault({
      rating: 5,
    });
    this.setPrefix("filter[", "]");
  }
}

Импортируемый по умолчанию из "nuxoblivius/filter" класс Filter предоставляет следующие функции:

  • createFilter ({ Object }) - функция, определяющая параметры фильтра. Здесь также нужно осуществить и типизацию параметров.
  • setDefault ({ Object }) - функция для записи значений параметров фильтра по умолчанию
  • setPrefix (start: string, end: string) - функция, позволяющая установить префикс и суффикс ко всем параметрам фильтра (чтобы не дублировать их написание много раз).

Данной логики достаточно для работы фильтра, если он будет работать по принципу emit-always - т.е., по сути, нужно лишь дописывать нужные query-параметры в api-запросах. Непосредственно же фильтрацию будет осуществлять backend.

В случае локальной фильтрации в классе фильтра необходимо создать функцию resolve (el: Element), по возвращаемому значению которой (true / false) и будет определяться, "отсекается" элемент, или нет. Простейший пример:

ts
export default class FilterFilmLocal extends Filter {
  protected static globalName = "FilterFilmsLocal";
  protected resolve(el: IFilmResponse) {
    return Boolean(el.nsfw == true); // Hide it
  }
}

Объект state-менеджера использует класс фильтра следующим образом:

ts
public schedules = state<IFilmResponse>([])
	.api("/api/films")
	.template('my-template')
	.filter(FilterPost.ref(), 'emit-always')

2023-2025 Power tool for creating project with Enjoy!