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

标签 angular typescript angular-material2 angular-cdk

我目前正在开发一个组件,该组件使用 Material 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
} 

谓词类型的接口(interface):

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 替换为我的,而不重写 material 2 包中的函数。有没有办法在 typescript 中做到这一点?

如果有人知道为什么这会起作用,尽管会抛出错误,那对哈哈来说会很有趣

最佳答案

目前不支持,但有一个开放的feature request在 Github 上。它已添加到功能列表中,因此可能值得关注。

在问题中,建议创建您自己的 DataSource,并使用接受数组而不是字符串的过滤器。看看 MatTableDataSource它扩展了 DataSource类。

关于Angular 5 Material Table 用具有不同参数类型的函数替换 filterPredicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49887051/

相关文章:

angular - 在 Angular 9 中,如何在 ng 构建期间替换 asset 文件夹中的配置文件?

typescript - 我可以在 TypeScript lambda 中访问另一个吗?

angular - 如何在 cypress 测试中实现拖放?

angular-material2 - 自动完成-以编程方式选择选项

angular - 名称属性结果为未定义的条件输入

typescript - 从 Angular2 升级到 Angular4 后 ng build --prod 失败

Angular 2/4 Observable - 为什么 ng2-dragula 在 UI 中进行一次拖放后会发送多个放置事件?

javascript - 将数组传递给组件时出错(React - TypeScript)

javascript - 将 PWA 添加到 Angular 8 - 模块构建失败

android - Angular Material 对话框动画在移动设备上非常慢