Angular 使用自定义filterPredicate对角垫表进行分组和行过滤

Angular 使用自定义filterPredicate对角垫表进行分组和行过滤,angular,typescript,mat-table,Angular,Typescript,Mat Table,我有一个带有多个过滤器的表,我使用自定义filterPredicate来处理行过滤部分,它工作得很好,直到我添加了表行组,也使用了自定义filterPredicate,现在我不知道如何将这两个自定义filterPredicate合并为一个,如何将行过滤添加到customFilterPredicate()方法用于分组,也许我应该使用自定义filterPredicate进行行筛选,并使用不同的方法进行分组,有什么想法吗 My typescipt code... dataSour

我有一个带有多个过滤器的表,我使用自定义filterPredicate来处理行过滤部分,它工作得很好,直到我添加了表行组,也使用了自定义filterPredicate,现在我不知道如何将这两个自定义filterPredicate合并为一个,如何将行过滤添加到customFilterPredicate()方法用于分组,也许我应该使用自定义filterPredicate进行行筛选,并使用不同的方法进行分组,有什么想法吗

My typescipt code...
    

     dataSource = new MatTableDataSource<UserData | Group>([]);
    
       constructor(formBuilder: FormBuilder) {
     
        this.dataSource.filterPredicate = ((data, filter) => {
            const a = !filter.gesellschaft || data.gesellschaft.toLowerCase() === filter.gesellschaft.toLowerCase();
            const b = !filter.katalogNr || data.katalogNr.toLowerCase().includes(filter.katalogNr);
            const c = !filter.softfairId || data.softfairId.toLowerCase().includes(filter.softfairId);
            const d = !filter.vonDate || new Date(filter.vonDate).getTime() <= this.transformDate(data.versioniert);
            const e = !filter.bisDate || new Date(filter.bisDate).getTime() >= this.transformDate(data.versioniert);
            return a && b && c && d && e;
        }) as (UserData, string) => boolean;
    
        this.formControl = formBuilder.group({
          vonDate: "",
          bisDate: "",
          gesellschaft: "",
          katalogNr: "",
          softfairId: ""
        });
    
        this.formControl.valueChanges.subscribe(value => {
          const filter = {
            ...value,
            vonDate: value.vonDate,
            bisDate: value.bisDate,
            gesellschaft: value.gesellschaft.trim().toLowerCase(),
            katalogNr: value.katalogNr.trim().toLowerCase(),
            softfairId: value.softfairId.trim().toLowerCase(),
          } as string;
          this.dataSource.filter = filter;
        });
      }
    
    ngOnInit(){
        this.dataSource.data = this.addGroups(ELEMENT_DATA, this.groupByColumns);
        this.dataSource.filterPredicate = this.customFilterPredicate.bind(this)
        this.dataSource.filter = performance.now().toString();
     }
    
    
      customFilterPredicate(data: UserData | Group, filter: string): boolean {
        return (data instanceof Group) ? data.visible : this.getDataRowVisible(data);
      }
    
      getDataRowVisible(data: UserData): boolean {
        const groupRows = this.dataSource.data.filter(
          row => {
          
            if (!(row instanceof Group)) return false;
    
            let match = true;
            this.groupByColumns.forEach(
              column => {
                if (!row[column] || !data[column] || row[column] !== data[column]) match = false;
              }
            );
            return match;
          }
        );
    
        if (groupRows.length === 0) return true;
        if (groupRows.length > 1) throw "Data row is in more than one group!";
        const parent = <Group><unknown>groupRows[0]; 
    
        return parent.visible && parent.expanded;
      }
我的打字密码。。。
数据源=新MatTableDataSource([]);
构造函数(formBuilder:formBuilder){
this.dataSource.filterPredicate=((数据,过滤器)=>{
常量a=!filter.gesellschaft | | data.gesellschaft.toLowerCase()==filter.gesellschaft.toLowerCase();
常量b=!filter.katalogNr | | data.katalogNr.toLowerCase().includes(filter.katalogNr);
const c=!filter.softfairId | | data.softfairId.toLowerCase().includes(filter.softfairId);
const d=!filter.vonDate | | new Date(filter.vonDate).getTime()=this.transformDate(data.versioniert);
返回a&&b&&c&&d&&e;
})as(UserData,string)=>布尔值;
this.formControl=formBuilder.group({
vonDate:“,
双日期:“,
格塞尔沙夫特:“,
卡塔洛格:“,
softfairId:“
});
this.formControl.valueChanges.subscribe(值=>{
常数过滤器={
价值
vonDate:value.vonDate,
bisDate:value.bisDate,
gesellschaft:value.gesellschaft.trim().toLowerCase(),
katalogNr:value.katalogNr.trim().toLowerCase(),
softfairId:value.softfairId.trim().toLowerCase(),
}如弦;
this.dataSource.filter=过滤器;
});
}
恩戈尼尼特(){
this.dataSource.data=this.addGroups(ELEMENT_data,this.groupByColumns);
this.dataSource.filterPredicate=this.customFilterPredicate.bind(this)
this.dataSource.filter=performance.now().toString();
}
customFilterPredicate(数据:UserData |组,筛选器:字符串):布尔值{
return(集团的数据实例)?data.visible:this.getDataRowVisible(数据);
}
getDataRowVisible(数据:UserData):布尔值{
const groupRows=this.dataSource.data.filter(
行=>{
如果(!(组的行实例))返回false;
让match=true;
this.groupByColumns.forEach(
列=>{
如果(!行[列]| |!数据[列]|行[列]!==数据[列])匹配=false;
}
);
复赛;
}
);
如果(groupRows.length==0)返回true;
如果(groupRows.length>1)抛出“数据行在多个组中!”;
const parent=groupRows[0];
返回parent.visible&&parent.expanded;
}