You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在ag-grid中显示行序号(拖拽排序后自动更新)

解决AG Grid拖拽重排后行序号不自动更新的问题

我明白你的痛点——用rowIndex作为行序号时,拖拽重排后序号不会跟着刷新,还要手动监听事件太麻烦。其实AG Grid本身就提供了更优雅的方式,不需要额外加事件监听。

问题根源

你之前用的args.node.rowIndex是节点在原始数据源中的索引,当开启rowDragManaged: true拖拽重排时,虽然AG Grid会更新rowData的顺序,但rowIndex并不会触发单元格的即时重新渲染,导致序号显示滞后。

最优解决方案

改用AG Grid API的getDisplayedRowIndex(node)方法,这个方法会返回当前节点在显示列表中的实时位置,无论拖拽、排序还是过滤操作,只要行的显示顺序变化,valueGetter就会自动重新计算这个值,完美适配你的需求。

修改你的_getIndexValue方法即可:

_getIndexValue(args: ValueGetterParams): any {
  // 返回当前节点在显示列表中的索引(从0开始)
  return args.api.getDisplayedRowIndex(args.node);
}

完整修改后的代码

import { Grid, GridOptions, ColDef } from "ag-grid/main";
import { ValueGetterParams } from "ag-grid/dist/lib/entities/colDef";
// for ag-grid-enterprise users only
import 'ag-grid-enterprise/main';
import "ag-grid/dist/styles/ag-grid.css";
import "ag-grid/dist/styles/ag-theme-balham.css";

class SimpleGrid {
  _getIdValue(args: ValueGetterParams): any {
    return args.node.id;
  }

  _getIndexValue(args: ValueGetterParams): any {
    // 替换为实时获取显示索引的方法
    return args.api.getDisplayedRowIndex(args.node);
  }

  private gridOptions: GridOptions = <GridOptions>{};

  constructor() {
    this.gridOptions = {
      columnDefs: this.createColumnDefs(),
      rowData: this.createRowData(),
      rowDragManaged: true,
    };
    let eGridDiv:HTMLElement = <HTMLElement>document.getElementById('myGrid');
    new Grid(eGridDiv, this.gridOptions);
  }

  // specify the columns
  private createColumnDefs(): ColDef[] {
    return [
      {headerName: "Index", valueGetter: (args) => this._getIndexValue(args), rowDrag: true},
      {headerName: "ID", valueGetter: (args) => this._getIdValue(args)},
      {headerName: "Make", field: "make"},
      {headerName: "Model", field: "model"},
      {headerName: "Price", field: "price"}
    ];
  }

  // specify the data
  private createRowData() {
    return [
      {make: "Toyota", model: "Celica", price: 35000},
      {make: "Ford", model: "Mondeo", price: 32000},
      {make: "Porsche", model: "Boxter", price: 72000}
    ];
  }
}

window.addEventListener("load", () => {
  new SimpleGrid();
});

效果验证

现在拖拽Porsche到顶部,它的Index会自动变成0,Toyota变为1,Ford变为2——完全符合你的预期,而且不需要额外监听dragEnd事件强制更新,AG Grid会自动处理渲染逻辑。

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

火山引擎 最新活动