You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AG-Grid免费版切换页大小时getRows重复调用问题求助

问题分析与解决方案

问题原因

当你同时更新AG-Grid的paginationPageSize(页大小)和cacheBlockSize(缓存块大小)时,AG-Grid会触发两次getRows调用:

  • 第一次是paginationPageSize变更导致分页系统重置,触发数据加载
  • 第二次是cacheBlockSize变更导致无限行模型的缓存机制重新初始化,再次触发数据加载

切换上下页时无此问题,是因为此时仅触发分页位置变更,不会修改缓存块大小,因此只会触发一次getRows。

修复方案

1. 批量更新配置并手动控制缓存刷新

避免分开调用setPaginationPageSize和setCacheBlockSize,改用setGridOption批量更新参数,之后手动触发一次缓存刷新,确保只发起一次请求:

onPageSizeChange(newSize: number) {
  // 批量更新分页和缓存配置
  this.gridApi.setGridOption({
    paginationPageSize: newSize,
    cacheBlockSize: newSize
  });
  // 清除现有缓存并刷新,仅触发一次getRows
  this.gridApi.refreshInfiniteCache({ purge: true });
  // 回到第一页(可选,根据业务需求调整)
  this.gridApi.paginationGoToPage(0);
}

2. 优化getRows函数,避免重复请求(兜底方案)

如果上述方法仍有问题,可以在getRows中添加重复请求判断,通过请求参数做去重:

private lastRequest: { offset: number; limit: number } | null = null;

getRows(params: IGetRowsParams) {
  const offset = params.startRow;
  const limit = params.endRow - params.startRow;

  // 判断是否为重复请求,直接返回缓存结果
  if (this.lastRequest?.offset === offset && this.lastRequest?.limit === limit) {
    params.successCallback(this.cachedData, this.totalRowCount);
    return;
  }

  this.lastRequest = { offset, limit };
  this.mockService.getData(offset, limit).subscribe(data => {
    this.cachedData = data.rows;
    this.totalRowCount = data.total;
    params.successCallback(data.rows, data.total);
    this.lastRequest = null;
  });
}

机制澄清

使用无限行模型结合分页时,cacheBlockSize应该始终等于paginationPageSize,这样每个缓存块刚好对应一页数据,AG-Grid的分页和缓存机制可以更好地协同工作。如果两者不一致,会导致缓存碎片和不必要的请求触发。

内容的提问来源于stack exchange,提问作者Khaled Saleh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 14:07:12