【问题标题】:Angular Material table set/disable filterPredicate to search all columnsAngular Material 表设置/禁用 filterPredicate 以搜索所有列
【发布时间】:2021-12-16 04:46:27
【问题描述】:

我有一个使用过滤栏的垫表。我以前没有使用 filterPredicate 函数,该表将根据数据源中的所有列和数据进行过滤。

我已经添加了这个:

ngAfterViewInit(): void {
  this.dataSource.filterPredicate = (data, filter: string): boolean => {
    if (this.columnSearch === "(All)") {
      return;
    }
    if (!data[this.columnSearch]) {
      data[this.columnSearch] = "";
    }
    return data[this.columnSearch]
    .toString()
    .toLowerCase()
    .includes(filter);
  };
}

this.columnSearch 变量以 2 方式绑定到我的选择控件。此控件定义当前正在过滤的列。我希望 "(All)" 选择从所有列中过滤。我需要一种在选择所有列时禁用 filterPredicate 的方法。

【问题讨论】:

    标签: angular angular-material


    【解决方案1】:

    数据源过滤谓词表达式

    // Filter Predicate Expression to perform Multiple KeyWord Search
        this.dataSource.filterPredicate = ((data: DeviceInventory, filter) => {
          const a = !filter.uniqueNumber || data.uniqueNumber.trim().toLowerCase().includes(filter.uniqueNumber);
          const b = !filter.model || data.modelCode==filter.model;
          const c = !filter.modelType || data.modelType == filter.modelType;
          const d = !filter.serialNumber || data.serialNumber.trim().toLowerCase().includes(filter.serialNumber);
          return a && b && c && d;
        }) as (DeviceInventory, string) => boolean;
    
    
    // Filter Controls FormValue change event
    this.filterForm.valueChanges.subscribe(value => {
      this.dataSource.filter = value;
    });
    

    【讨论】:

      【解决方案2】:

      这是我能想到的解决方案。循环遍历所有对象键并使用 include() 返回 true 或 false

      this.dataSource.filterPredicate = (data, filter: string): boolean => {
      
        // Check if "All Columns" is selected.
        // Loop through table object keys and check if the filter matches any. 
        if (this.columnSearch === "(All Columns)") {
          for (let index = 0; index < Object.keys(data).length; index++) {
            const key = Object.keys(data)[index];
            if (!data[key]) {
              data[key] = "";
            }
            if (
              data[key]
                .toString()
                .toLowerCase()
                .includes(filter)
            ) {
              return true;
            }
          }
          return false;
        }
      
        if (!data[this.columnSearch]) {
          data[this.columnSearch] = "";
        }
      
        return data[this.columnSearch]
          .toString()
          .toLowerCase()
          .includes(filter);
      };
      

      【讨论】:

        猜你喜欢
        • 2020-06-15
        • 1970-01-01
        • 2018-07-06
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        相关资源
        最近更新 更多