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

如何在可展开UI Grid中根据父行数据自动选中子网格行?

解决UI Grid展开父行时自动选中子网格对应行的问题

问题描述

我正在实现可展开UI Grid,希望在父行展开时,根据父行数据自动选中子网格中的对应行。
请问如何获取子网格的行列表?是否可以通过gridApi.selection方法查找并选中子网格行?我知道若能获取子网格行,可设置isSelected = true来选中,但$scope.gridApi.grid.rows获取的行列表不包含子网格行,不知如何获取子网格行。

用户提供的代码示例:

$scope.fruits = [...];
$scope.colors = [...];
$scope.gridOptions = {
  data: $scope.fruits,
  enableRowSelection: true,
  expandableRowTemplate: '<div ui-grid="row.entity.subGridOptions"></div>',
  ...
  onRegisterApi: function (gridApi) {
    $scope.gridApi = gridApi;
    gridApi.expandable.on.rowExpandedStateChanged($scope, function (row) {
      if (row.isExpanded) {
        row.entity.subGridOptions = {
          data: $scope.colors,
          ...
        };
        if (row.entity.color_id) {
          // 此处需要帮助
          _.forEach(/*子网格中的行*/, function(colorRow) {  
            if (colorRow.entity.id === row.entity.color_id) {
              colorRow.isSelected = true;
            }
          });
        }
      }
    });
  }
};

解决方案

1. 为子网格单独注册GridApi

子网格的GridApi独立于父网格,必须在创建子网格配置时注册并保存引用,才能后续操作子网格:

row.entity.subGridOptions = {
  data: $scope.colors,
  enableRowSelection: true, // 必须开启行选择功能
  onRegisterApi: function(subGridApi) {
    // 将子网格Api存入父行实体,方便后续调用
    row.entity.subGridApi = subGridApi;
  }
  // 其他子网格配置项...
};

2. 通过子网格Api实现自动选中

有了子网格的Api引用后,有两种可靠的方式实现选中:

方式一:使用selectionApi的selectRow方法(推荐)

直接通过数据项选中,无需遍历行列表:

if (row.entity.color_id) {
  // 匹配子网格中对应ID的数据
  const targetColor = $scope.colors.find(color => color.id === row.entity.color_id);
  if (targetColor) {
    // 调用子网格的选中方法
    row.entity.subGridApi.selection.selectRow(targetColor);
  }
}

方式二:遍历子网格行设置选中状态

如果需要遍历行操作,需等待子网格渲染完成后再执行:

if (row.entity.color_id) {
  // 用$timeout确保子网格DOM渲染完成,能获取到行数据
  $timeout(() => {
    _.forEach(row.entity.subGridApi.grid.rows, function(colorRow) {  
      if (colorRow.entity.id === row.entity.color_id) {
        colorRow.isSelected = true;
        // 触发选择事件更新视图
        row.entity.subGridApi.selection.notifyRowSelectionChanged(colorRow);
      }
    });
  });
}

关键注意点

  • 子网格必须开启enableRowSelection: true,否则选中逻辑不会生效。
  • 子网格行数据需要等待DOM渲染完成后才能获取,$timeout是简单可靠的等待方式。
  • 父网格的GridApi只能操作父行,子网格的操作必须用自身的GridApi引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:55:20