Я пытаюсь реализовать механизм фильтрации в новом приложении Angular2, который позволил бы мне фильтровать список записей в массиве. Записи могут иметь около 20 свойств, которые можно фильтровать. До сих пор я создал список фильтров в одном компоненте, а затем компонент списка, который направляется в качестве дочернего элемента. Затем я планировал передать фильтры как queryParams через маршрутизатор. Начиная с одного фильтра, все было в порядке:
На стороне отправки у меня было:
this.router.navigate(['/findlist'], {queryParams: {'g': myParam}});
На принимающей стороне у меня было:
this.subscription = this.route.queryParams.subscribe(
(queryParam: any) => this.myFilter = queryParam['g']
);
Затем я передаю myFilter каналу фильтра, чтобы выполнить сопоставление и фильтрацию. Пока все в порядке.
Однако я не могу понять, как масштабировать это, чтобы учесть несколько потенциальных параметров, большинство из которых будут пустыми/не нужными.
Я могу себе представить, что мне нужно будет определить массив, содержащий ВСЕ активные фильтры через queryParam, но единственная документация, которую я могу найти, показывает только примеры с одним переданным параметром. Я пробовал играть с:
{queryParams: { pass an array here! }}
Но моя IDE регистрирует ошибку, если я добавляю что-то кроме пары ключ:значение.
Вероятно, я мог бы просто добавлять все возможные фильтры и их значения каждый раз, но это каждый раз создавало бы глупо длинную строку URL с большинством пустых значений или «Все» и т. д., что не очень красиво.
Поэтому я думаю, что мой рабочий процесс должен заключаться в том, что на стороне отправки я поддерживаю массив всех фильтров и их состояний, а затем каждый раз, когда нажимается одна из кнопок фильтра, я сначала обновляю соответствующее значение в массиве, а затем передаю весь массив через параметры запроса.
На стороне приема я каким-то образом должен получать и обрабатывать Param как массив, а затем извлекать каждую запись как переменные для последующей обработки в фильтре. Я также хочу быть СУХИМ, поэтому на самом деле не хочу, чтобы несколько операторов на стороне приема эффективно выполняли одно и то же для разных свойств, проще говоря, вместо этого имеет смысл циклически перемещаться по массиву.
Я надеюсь, что это имеет смысл, я был бы признателен, если бы у кого-нибудь есть предложение, даже если это означает передачу данных по-другому. Например, в настоящее время я пытаюсь понять, могу ли я просто передать данные, создав отдельную службу фильтрации и передав ее с помощью @Input вместо этого.
Любые идеи с благодарностью получены (любитель-самоучка, поэтому, вероятно, упустил что-то очевидное!)
Спасибо
Тони