AG-Grid如何排除选中行不受setQuickFilter过滤影响?
AG-Grid 实现选中行不受搜索过滤影响的方案
AG-Grid 完全支持这类需求,你需要结合外部过滤器和手动触发过滤刷新来实现,之前的问题出在没有在选中行或搜索条件变化时主动触发过滤更新。以下是具体实现步骤:
核心思路
让所有选中行直接通过过滤,未选中行则匹配用户的搜索条件;同时在搜索关键词变化、选中行变化时,主动通知网格重新执行过滤逻辑。
具体实现代码示例
// 维护全局状态:搜索关键词、选中行ID列表 let searchKeyword = ''; let selectedRowIds = []; // 网格配置 const gridOptions = { rowSelection: 'multiple', // 启用多行选中 // 告诉网格存在外部过滤逻辑 isExternalFilterPresent: () => true, // 自定义过滤规则 doesExternalFilterPass: (rowNode) => { // 规则1:选中的行直接通过过滤 if (selectedRowIds.includes(rowNode.data.id)) { return true; } // 规则2:未选中行匹配搜索关键词(复用AG-Grid快速过滤器逻辑) const quickFilter = gridApi.getQuickFilterInstance(); return quickFilter.doesRowPassQuickFilter(rowNode, searchKeyword); }, // 选中行变化时更新状态并触发过滤刷新 onSelectionChanged: () => { selectedRowIds = gridApi.getSelectedNodes().map(node => node.data.id); gridApi.onFilterChanged(); } }; // 搜索输入框的处理函数 function onSearchInputChange(e) { searchKeyword = e.target.value.trim(); // 手动触发过滤刷新 gridApi.onFilterChanged(); }
关键说明
- 不要调用setQuickFilter:我们自己维护搜索关键词,通过
getQuickFilterInstance().doesRowPassQuickFilter复用AG-Grid内置的快速过滤逻辑,避免全局覆盖过滤规则。 - 手动触发过滤刷新:
isExternalFilterPresent和doesExternalFilterPass不会自动监听选中行或搜索条件的变化,必须调用gridApi.onFilterChanged()来强制网格重新计算过滤结果。 - 选中行状态维护:通过
onSelectionChanged事件实时更新选中行的ID列表,确保过滤规则能获取最新的选中状态。
内容的提问来源于stack exchange,提问作者user15229015
相关产品推荐
相关产品推荐

