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

如何配置客户端AG Grid表格实现子行从独立API加载

问题描述

我有一个雇主表格,需求是展开雇主行时,在下方子行中显示其角色变更历史,这些「版本历史子行」需通过独立后端接口获取,表格采用客户端加载模式(不使用服务端配置)。

我尝试用Tree Data方案:点击展开行时,将对应的子行数据添加到主rowData中并展开该行,但遇到问题:若初始无子行,展开/折叠图标不会显示,而我希望仅在展开行后再获取子行数据。

请问如何配置AG Grid实现该功能?


解决方案

要实现初始显示展开图标、点击后动态加载子数据的效果,核心是让AG Grid认定每个父节点「存在展开可能性」,同时在展开触发时完成数据加载与表格更新,具体配置要点如下:

  • 强制显示展开图标:通过getIsExpandable回调函数,让所有父节点始终显示展开/折叠图标,无需依赖初始子行数据。
  • 绑定展开事件加载数据:使用onNodeExpanded事件(而非点击行事件)触发子数据加载,避免误触。
  • 避免重复加载:给父节点数据添加标记位,判断是否已加载过子数据,防止重复调用接口。
  • 更新表格并保持展开状态:获取子数据后更新rowData,调用setRowData刷新表格,再重新设置节点为展开状态。

修改后的代码示例
// 初始行数据(来自API)
const rowData = [
  {
    id: 'erica', // 添加唯一ID用于标记
    orgHierarchy: ['Erica Rogers'],
    jobTitle: 'CEO',
    hasLoadedChildren: false // 标记是否已加载子数据
  },
  {
    id: 'jos',
    orgHierarchy: ['Jos Peeters'],
    jobTitle: 'CEO',
    hasLoadedChildren: false
  }
];

// 模拟后端接口获取角色变更历史
const fetchRoleHistory = (parentId) => {
  // 实际项目替换为真实API请求
  return new Promise(resolve => {
    setTimeout(() => {
      if (parentId === 'erica') {
        resolve([
          {
            orgHierarchy: ['Erica Rogers', 'Edited'],
            jobTitle: 'Exec. Vice President'
          }
        ]);
      } else if (parentId === 'jos') {
        resolve([
          {
            orgHierarchy: ['Jos Peeters', 'Edited'],
            jobTitle: 'Senior Manager'
          },
          {
            orgHierarchy: ['Jos Peeters', 'Promoted'],
            jobTitle: 'Executive Director'
          }
        ]);
      }
    }, 500);
  });
};

const gridOptions = {
  columnDefs: [
    { field: 'jobTitle' },
    { field: 'employmentType' },
  ],
  defaultColDef: {
    flex: 1,
  },
  autoGroupColumnDef: {
    headerName: 'Organisation Hierarchy',
    minWidth: 300,
    cellRendererParams: {
      suppressCount: true,
    },
  },
  rowData,
  treeData: true,
  animateRows: true,
  groupDefaultExpanded: -1,
  getDataPath: (data) => data.orgHierarchy,
  // 强制所有父节点显示展开图标
  getIsExpandable: (node) => true,
  // 节点展开时加载子数据
  onNodeExpanded: async (params) => {
    const parentData = params.node.data;
    
    // 跳过已加载的节点
    if (parentData.hasLoadedChildren) return;
    
    // 调用接口获取子数据
    const childRows = await fetchRoleHistory(parentData.id);
    
    // 添加子数据到主数据集
    rowData.push(...childRows);
    
    // 更新表格数据
    params.api.setRowData(rowData);
    
    // 标记已加载状态
    parentData.hasLoadedChildren = true;
    
    // 保持节点展开状态
    params.node.setExpanded(true);
  },
  // 设置行唯一ID,确保表格正确识别行数据
  getRowNodeId: (data) => data.orgHierarchy.join('_')
};

// 初始化表格(假设页面存在id为'grid'的容器)
document.addEventListener('DOMContentLoaded', () => {
  const gridDiv = document.querySelector('#grid');
  new agGrid.Grid(gridDiv, gridOptions);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 03:37:53