我有一个使用筛选条的Mat Table。我以前没有使用过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变量双向绑定到我的select控件。此控件定义当前正在筛选的列。我希望"(All)"选择从所有列中进行过滤。我需要一种方法来禁用filterPredicate时,所有列都被选中。
发布于 2021-12-15 20:46:28
数据源FilterPredicate表达式
// 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;
});发布于 2020-03-07 07:38:51
这是我能想到的解决方案。使用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);
};https://stackoverflow.com/questions/60571419
复制相似问题