ag-grid从16.0.1升级至25.1.0后如何实现旧版仅显示匹配过滤条件的树节点
ag-grid v20+ 对树数据过滤的默认逻辑做了调整:只要父节点匹配过滤条件,其下所有子节点都会默认展示,不再单独做过滤判断,你之前配置的filterValueGetter不生效是因为默认逻辑下分组列只会对组节点执行过滤值计算,叶子节点直接继承父节点的过滤结果。
方案1:使用官方内置配置(推荐,适配v25.x版本)
在gridOptions的autoGroupColumnDef和全局配置中增加如下参数即可恢复旧版过滤逻辑:
const gridOptions = { autoGroupColumnDef: { filter: 'agTextColumnFilter', floatingFilter: true, filterValueGetter: ({ data }) => data?.path ? data.path[data.path.length - 1] : '', filterParams: { // 设置树过滤策略为仅匹配当前节点,不继承父节点匹配结果 treeFilterStrategy: 'matchNodeOnly' } }, treeData: true, getDataPath: ({ path }) => path, // 全局关闭父节点匹配时自动包含子节点的逻辑 groupIncludeChildren: false }
方案2:自定义外部过滤(兼容性最强,不受版本默认逻辑影响)
如果内置配置不生效,可以用ag-grid的外部过滤能力完全自定义判断逻辑,100%符合业务需求:
const gridOptions = { autoGroupColumnDef: { filter: 'agTextColumnFilter', floatingFilter: true }, treeData: true, getDataPath: ({ path }) => path, // 启用外部过滤 isExternalFilterPresent: () => { const groupFilter = gridOptions.api.getFilterInstance('ag-Grid-AutoColumn'); return !!groupFilter?.getModel(); }, // 自定义每个节点的过滤判断逻辑 doesExternalFilterPass: (node) => { const groupFilter = gridOptions.api.getFilterInstance('ag-Grid-AutoColumn'); const filterModel = groupFilter.getModel(); // 无过滤条件时全部展示 if (!filterModel) return true; const keyword = filterModel.filter.toLowerCase(); // 仅用当前节点路径的最后一段做匹配判断 const currentNodeName = node.data.path.at(-1).toLowerCase(); return currentNodeName.includes(keyword); } }
配置完成后调用gridOptions.api.onFilterChanged()触发过滤刷新即可。
内容的提问来源于stack exchange,提问作者Vladimir Kovarsky
相关产品推荐
相关产品推荐

