我目前正在研究一个使用材料 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。
现在我使用此函数通过服务获取表的数据,设置我的 dataSource 并替换 dataSource 的 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;
})
}
有趣的是,当我使用它时过滤器会起作用,但它总是抛出一个错误,说我不能用我的自定义过滤器替换过滤器谓词,因为它期望过滤器参数是一个字符串。
所以我的问题是,如何在不重写材料2包中的函数的情况下用我的this.dataSource.filterPredicate替换。有没有办法在打字稿中做到这一点?
如果有人知道为什么会这样,尽管抛出错误,那会很有趣,哈哈