Вот немного более элегантное решение.
Объявите интерфейс TableFilter для удобства:
interface ITableFilter {
column: string;
value: any;
}
Функция предиката фильтра вызывается один раз в строке (!) При применении фильтрации: если предикат возвращает значение true, текущая строка будет включена в отфильтрованные результаты. Поэтому мы будем перебирать массив фильтров и возвращать false, если в одном из столбцов есть несоответствие.
Замените свой фильтр источника данныхПредикат следующим пользовательским:
setDataSource() {
this.dataSource = new MatTableDataSource(this.yourData);
this.dataSource.filterPredicate = this.customFilterPredicate;
}
private customFilterPredicate(data: any, filters: ITableFilter[]): boolean {
for (let i = 0; i < filters.length; i++) {
const fitsThisFilter = data[filters[i].column].toLowerCase().includes(filters[i].value);
if (!fitsThisFilter) {
return false;
}
}
return true;
}
После этого вы можете применить свой фильтр следующим образом:
// implement some relevant logic to build the filters array
const filter: any = [{column: 'name', value: 'foo'}, {column: 'description', value: 'bar'}];
// this is how you apply a filter
this.dataSource.filter = filter;
Немного глупо, что нам нужно установить фильтры как 'any'; но функция фильтра ожидает строку, и другого способа обойти ее нет.