Так что я пытаюсь добиться, чтобы переключать несколько фильтров на NgFor с его обновлением каждый раз, когда фильтр включается или выключается.Фильтр пользовательских труб?
У меня есть эта труба:
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'filterProducts'
})
export class FilterProducts implements PipeTransform {
transform(products: any[], args: {[field : string] : string[]}): any[] {
if (!products) return [];
if (!args) return products;
return products.filter((pr: any) => {
for(let field in args) {
if(args[field ].indexOf(pr[field]) === -1) {
return false;
}
}
return true;
});
}
}
В моем app.module.ts я (Уменьшенный для краткости):
import { FilterProducts } from '../pages/products/productsFilter.pipe';
@NgModule({
declarations: [
FilterProducts
]
})
В моей компоненте продукта у меня есть:
public filterArgs : {[field : string] : string[]} = {};
constructor() { }
addBrandFilter(brands: string[]) {
this.addFilter('brand', brands);
}
addFilter(field: string, values: string[]): void {
this.filterArgs[field] = values;
}
И затем на моем NgFor Я (сокращенно для краткости):
*ngFor="let product of products | filterProducts: filterArgs;"
<li class="search-filters__item" (click)="addBrandFilter(['Brand Name'])">Brand Name</li>
Способ, которым у меня есть шаблон, который выполняет настройку фильтрации, содержит подразделы Цена, Марка и Тип. Внутри них есть несколько кнопок, которые пользователь может щелкнуть, например, цена равна 0-50 или 50-100 и т. Д. В идеале я бы хотел, чтобы они могли применяться одновременно. Таким образом, будут выбраны 0-50 и 50-100, а фильтр ngFor - соответствующим образом.
Может ли кто-нибудь дать мне несколько советов о том, как достичь этого? Я искал везде и могу найти трубы только на основе поисковых ящиков или выпадающих меню.
EDIT
Я теперь обновил это, чтобы отразить помощь, оказанную мне @PierreDuc. Теперь я пытаюсь передать соответствующие фильтры в filterArgs.
EDIT 2
я теперь обновил этот раз, чтобы отразить прогресс благодаря @PierreDuc. В настоящее время ngFor не фильтрует имя бренда, прошедшее через (щелчок).
Заранее спасибо.
Благодарим вас за это, это прекрасно работало. Как перенести это на возможность щелчка по набору фильтров, чтобы затем фильтровать ngFor? Скажем, я хотел бы видеть продукты, которые от £ 0 - £ 50, имеют название «Бренд» и являются «TypeA»? (Извините, если это не имеет смысла). – Alsh
Я обновил свой ответ, непроверенный код, хотя :) – PierreDuc
Большое спасибо, я внедрил это, но теперь я получаю сообщение об ошибке «Не могу прочитать имя свойства« неопределенного », когда я пытаюсь запустить функцию addBrandFilter (см. обновленный код). Есть идеи? :) – Alsh