AG Grid ServerSide RowModel无限加载分页循环请求BUG求助
问题核心
使用ServerSide RowModel时,初始加载及前两页滚动正常,但滚动到后续页面时出现行消失、插入加载行,且重复请求前一页数据的循环问题,调试发现loadedRowCount会莫名减少(如从50变为46),触发网格重新请求该页数据。
可能原因
getRowNodeId生成的ID不唯一
开启Master Detail模式后,若getRowNodeId返回的ID不是全局唯一(比如主行和子行ID重复,或不同页的主行ID冲突),AG Grid会错误地将不同行识别为同一节点,导致缓存中的行计数被覆盖或减少,进而触发重复请求。cacheBlockSize与paginationPageSize不匹配
ServerSide模式下,cacheBlockSize控制每次加载的行块大小,paginationPageSize是分页显示的行数,两者不一致时,网格的缓存管理逻辑会出现混乱,导致已加载行的计数错误。Master Detail 模式下的行高计算偏差
固定或动态的详情行高度如果配置不当,会导致网格在计算可视区域和缓存范围时出现误差,误判已加载行的数量,触发重复请求。AG Grid 32.0.2 版本特定Bug
该版本的ServerSide RowModel在Master Detail场景下可能存在缓存计数的逻辑缺陷,当总行数接近特定阈值时触发循环请求问题。
解决方法
1. 确保getRowNodeId返回全局唯一ID
必须保证主行和所有子行的ID完全不重复,示例实现:
getRowNodeId = (rowData: any) => { // 主行用前缀+唯一ID,子行用不同前缀区分 return rowData.isChild ? `child_${rowData.id}` : `parent_${rowData.id}`; };
2. 统一cacheBlockSize与paginationPageSize
将两个参数设置为相同值,避免缓存块和分页大小不匹配导致的逻辑冲突:
// 初始化时同步两个参数 this.selectedTamanhoPaginacao = 50; this.cacheBlockSize = this.selectedTamanhoPaginacao; this.gridOptions = { // ...其他配置 cacheBlockSize: this.cacheBlockSize, paginationPageSize: this.selectedTamanhoPaginacao, };
3. 验证详情行高度配置
- 若使用固定
detailRowHeight,确保值准确,避免因高度计算错误导致网格可视区域判断偏差; - 若使用动态高度,确保
getRowHeight函数逻辑正确,或临时固定高度排查是否为该问题导致。
4. 升级AG Grid版本
尝试升级到32.x最新补丁版本或33.x正式版本,官方可能已修复该场景下的缓存计数Bug。
5. 确保数据源返回的总行数稳定
在getRows回调中返回的rowCount必须是固定的总行数,不能随请求动态变化,否则网格会重新计算缓存范围,导致计数错误:
// 数据源示例 getRows(params: IServerSideGetRowsParams) { // 从后端获取数据和固定总行数 yourApiService.getData(params.request).subscribe((res) => { params.success({ rowData: res.data, rowCount: res.totalCount // 必须是固定的总行数,不能每次请求返回不同值 }); }); }
6. 关闭debug模式
临时关闭gridOptions中的debug: true,部分场景下debug模式会干扰缓存逻辑的正常执行。
内容的提问来源于stack exchange,提问作者guidmazzi

