Angular 5 Material Table将filterPredicate替换为具有不同参数类型的函数

Angular 5 Material Table将filterPredicate替换为具有不同参数类型的函数,angular,typescript,angular-material2,angular-cdk,Angular,Typescript,Angular Material2,Angular Cdk,我目前正在开发一个组件,它使用material 2表来显示一些数据。我需要能够编写自定义过滤器操作(例如价格>1)并组合多个过滤器。为此,我编写了一个自定义过滤器预测: customFilterPredicate(data: Coin, filters: Predicate[]): boolean { var operators = { '>=': function(a, b){ return +a >= +b }, '<=': func

我目前正在开发一个组件,它使用material 2表来显示一些数据。我需要能够编写自定义过滤器操作(例如价格>1)并组合多个过滤器。为此,我编写了一个自定义过滤器预测:

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
} 
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;
    })
  }
setData(){
返回新承诺((解决、拒绝)=>{
返回此.coinService.getCoins()
.订阅(硬币=>{
解析(硬币)
})
})
.然后((数据:Coin[])=>{
this.dataSource=新MatTableDataSource(数据);
this.dataSource.filterPredicate=this.customPredicate;
})
}
有趣的是,过滤在我使用它时起作用,但它总是抛出一个错误,说我不能用自定义的filterPredicate替换filterPredicate,因为它希望filter参数是字符串

所以我的问题是,如何用我的替换this.dataSource.filterPredicate,而不重写material 2包中的函数。有没有办法在typescript中实现这一点


如果有人知道为什么会这样,尽管抛出了错误,哈哈,这会很有趣,这目前不受支持,但Github上有一个开放的。它已添加到功能列表中,因此可能值得关注


在本期中,建议您使用接受数组而不是字符串的筛选器创建自己的
数据源
。查看扩展类的方法。

在设置filterPredicate时,可以使用bind()作为解决方法:

    this.dataSource.filterPredicate = this.customFilterPredicate.bind(this);
然后您可以访问局部变量,在我的例子中:

customFilterPredicate(data: Area, filter: string): boolean {
    return this.filterMatchesString(JSON.stringify(data), this.searchFilter) &&
        this.filterMatchesString(data.Area, this.areaFilter) &&
        this.filterMatchesString(data.Abbreviation, this.abbreviationFilter);
}
在您的例子中,它将是谓词数组。但是,每当任何谓词发生更改时,您都需要更新筛选器的值,只有在发生更改时,才会重新应用筛选器

filterChange() {
    this.dataSource.filter = this._searchFilter + this._areaFilter + this._abbreviationFilter;
}

我明白了,现在我将类型更改为any,并且不再抛出错误,但稍后我将再次查看以找到更好的解决方案。谢谢也许它是最近更新的,但是你不能通过设置filterPredicate函数来实现吗?filterPredicate=(data:any,filter:string)=>{(这里是您的过滤器)}然后获取过滤器字符串并将其转换为JavaScript对象?有点老套,但很管用
filterChange() {
    this.dataSource.filter = this._searchFilter + this._areaFilter + this._abbreviationFilter;
}