如何覆盖Ag-Grid的Set Filter匹配逻辑?仅过滤树形顶层父节点
解决Ag-Grid树形数据Set Filter仅作用于顶层父节点的方案
不需要从头构建自定义筛选器,有两种轻量方式可以实现需求,既能保留Set Filter原有的外观和交互,又能调整匹配逻辑:
方案一:通过getFilterValue统一子节点的筛选值
在列定义的filterParams中配置getFilterValue函数,让所有子节点向筛选器提供顶层父节点的列值。这样Set Filter的选项会自动基于顶层节点值生成(去重后),筛选时所有属于目标顶层节点的子节点都会被保留。
示例代码:
columnDefs: [ { field: 'name', filter: 'agSetColumnFilter', filterParams: { getFilterValue: (node) => { // 遍历找到顶层父节点(根据你的树形结构调整判断逻辑) let topNode = node; // 示例:level为0的是顶层节点,可根据实际结构修改 while (topNode.level > 0) { topNode = topNode.parent; } // 返回顶层节点的当前列值 return topNode.data.name; } } } ]
这种方式完全依赖Ag-Grid内置配置,代码量极少,是最推荐的方案。
方案二:扩展内置Set Filter重写过滤逻辑
如果需要保留Set Filter的选项显示所有节点值,但仅依据顶层父节点值过滤,可以扩展内置的agSetColumnFilter,重写其doesFilterPass方法。
示例代码:
// 导入内置Set Filter(根据你的项目环境调整导入方式) import { agSetColumnFilter } from '@ag-grid-community/core'; class TopLevelSetFilter extends agSetColumnFilter { doesFilterPass(params) { const node = params.node; // 找到顶层父节点 let topNode = node; while (topNode.level > 0) { topNode = topNode.parent; } // 获取顶层节点的当前列值 const topValue = topNode.data[this.column.colId]; // 获取筛选器选中的目标值集合 const selectedValues = this.model.values; // 判断顶层值是否在选中集合中 return selectedValues.includes(topValue); } } // 列定义中使用扩展后的筛选器 columnDefs: [ { field: 'name', filter: TopLevelSetFilter, filterParams: { // 保留原Set Filter的配置,如search、selectAll等 } } ]
两种方案都无需完全自定义筛选器,能最大程度保留Set Filter的原有体验,优先选择方案一实现需求。
内容的提问来源于stack exchange,提问作者DeejC
相关产品推荐
相关产品推荐

