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

Angular2 AgGrid加载时行数统计异常问题求助

解决AgGrid加载数据后无法正确统计行数的问题

这个问题我之前也碰到过,核心原因是AgGrid设置rowData后不会立刻完成数据渲染——你在http订阅回调里直接调用countOnSelectionChanged()时,Grid还没来得及把新的rowData加载并渲染到界面上,所以getDisplayedRowCount()返回的还是初始的0。而当你点击复选框触发onSelectionChanged时,Grid已经完成了数据渲染,自然能拿到正确的行数。

下面给你两种靠谱的解决方法:

方法1:监听rowDataChanged事件(推荐)

AgGrid提供了rowDataChanged事件,会在Grid完成rowData的更新和渲染后触发。你可以在onGridReady里注册这个事件,然后在事件回调中调用统计方法:

onGridReady(params) { 
  this.gridApi = params.api; 
  this.gridColumnApi = params.columnApi; 

  // 注册rowDataChanged事件监听
  params.api.addEventListener('rowDataChanged', () => {
    this.countOnSelectionChanged();
  });

  this.http.get(this.config.getUrl('myProject')).subscribe(data => { 
    this.columnDefs = data['headers']; 
    this.rowData = data['datas']; 
    params.api.sizeColumnsToFit(); 
  }); 
}

这样就能保证在Grid完全处理完新数据后再统计行数,拿到的totalResults就是正确的数值了。

方法2:使用gridApi.forEachNodeAfterFilterAndSort(适合需要立即统计的场景)

如果不想依赖事件监听,也可以直接遍历Grid的节点来统计行数,这种方式不依赖渲染状态:

修改你的countOnSelectionChanged方法:

countOnSelectionChanged() { 
  console.log('here'); 
  this.selectedResults = this.gridApi.getSelectedRows().length; 
  // 改用遍历节点的方式统计显示行数
  let displayedCount = 0;
  this.gridApi.forEachNodeAfterFilterAndSort(() => {
    displayedCount++;
  });
  this.totalResults = displayedCount;
  console.log('totalResults', this.totalResults); 
  console.log('selectedResults', this.selectedResults); 
}

不过这种方式更适合特殊场景,还是方法1的事件监听更符合AgGrid的设计逻辑。

另外要注意:如果你是通过双向绑定[rowData]="rowData"来给Grid传数据,AgGrid会自动触发rowDataChanged事件;如果是手动调用gridApi.setRowData(),也要确保调用后Grid有足够时间处理数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:50:05