В настоящее время я работаю над компонентом, который использует таблицу материалов 2 для отображения некоторых данных. Мне нужно иметь возможность писать собственные операции фильтрации (например, цена> 1) и комбинировать несколько фильтров. Чтобы это сработало, я написал собственный filterPredicate:
customFilterPredicate(data: Coin, filters: Predicate[]): boolean {
var operators = {
'>=': function(a, b){
return +a >= +b
},
'<=': function(a, b){
return +a <= +b
}
}
if(filters.length == 0) return true;
let res = false;
for(var i = 0; i < filters.length; i++){
let conditionMet = operators[filters[i].op](data[filters[i].columnName], filters[i].val);
if(conditionMet) {
res = true;
} else {
res = false;
break;
}
}
return res
}
интерфейс для типа предиката:
export interface Predicate {
field: columnName
op: string;
val: number;
visible: boolean;
}
CustomFilterPredicate проходит через все фильтры, переданные как параметр, и возвращает true, если все условия выполнены, и false, если одно или несколько условий не выполняются.
Теперь я использую эту функцию, чтобы получить данные для таблицы через службу, установить свой источник данных и заменить filterPredicate источника данных:
setData(){
return new Promise((resolve, reject) => {
return this.coinService.getCoins()
.subscribe(coins => {
resolve(coins)
})
})
.then((data: Coin[]) => {
this.dataSource = new MatTableDataSource<Coin>(data);
this.dataSource.filterPredicate = this.customPredicate;
})
}
Забавно то, что фильтрация работает, когда я ее использую, но всегда выдает ошибку, говоря, что я не могу заменить filterPredicate своим пользовательским, поскольку он ожидает, что параметр фильтра будет строкой.
Итак, у меня вопрос: как я могу заменить this.dataSource.filterPredicate моим, не переписывая функцию в пакете материала 2. Есть ли способ сделать это в машинописном тексте?
И если у кого-то есть идея, почему это работает, несмотря на то, что выдает ошибку, это было бы интересно, ха-ха