首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ag-Grid:如何保存和重新加载列顺序

Ag-Grid:如何保存和重新加载列顺序
EN

Stack Overflow用户
提问于 2018-07-23 22:58:33
回答 5查看 23.4K关注 0票数 15

使用Ag,用户可以按自己喜欢的方式拖动列来排序。我需要允许用户保存他们的列顺序(到SQL后端),使其成为他们的默认列顺序。我试着得到这样的列名:

代码语言:javascript
运行
复制
var cols = schedGridOptions.columnApi.getAllColumns();
for (col in cols) {
    var colDef = col.getColDef();
    console.log(colDef.headerName);
}

这是一个设置头部名称的示例,因此我尝试将其调整为获取标题名称。但我知道这个错误:

JavaScript运行时错误:对象不支持属性或方法“getColDef”

也许我做得不对?我在使用银栅方面还挺新的。寻求建议。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-07-24 15:56:48

您正在寻找setColumnState()和getColumnState()。见https://www.ag-grid.com/javascript-grid-column-api/的文档

在网格选项中,为gridReady和columnMoved设置事件处理程序。https://www.ag-grid.com/javascript-grid-events/

类似于:

代码语言:javascript
运行
复制
gridOptions = {
   rowData: myRowDataSource,
   columnDefs: myColumns,
   onGridReady: onGridReady,
   onColumnMoved: onColumnMoved,
}

在“移动列”事件上,保存columnState。下面是一个保存到本地存储的示例。将其更改为保存到数据库。

代码语言:javascript
运行
复制
onColumnMoved(params) {
  var columnState = JSON.stringify(params.columnApi.getColumnState());
  localStorage.setItem('myColumnState', columnState);
}

在网格就绪事件中,获取并恢复网格状态。再次,将此更改为从数据库中提取。

代码语言:javascript
运行
复制
onGridReady(params) {
    var columnState = JSON.parse(localStorage.getItem('myColumnState'));
    if (columnState) {
      params.columnApi.setColumnState(columnState);
    }
}
票数 34
EN

Stack Overflow用户

发布于 2019-07-31 09:15:47

每次该列移动时,onColumnMoved 都会触发,但拖动没有停止。

使用onColumnMoved根本就不是性能。

如果你关心性能,你应该使用onDragStopped

代码语言:javascript
运行
复制
gridOptions.onDragStopped = function (params) {
  const colIds = params.columnApi.getAllDisplayedColumns().map(col => col.colId)
  console.log(colIds) // all visible colIds with the visible order
}
票数 17
EN

Stack Overflow用户

发布于 2020-08-17 10:19:45

我的回答是对@roli的回答的一个小小的改进。只有在操作后更改列顺序时,才会触发该事件。如果用户拖放并决定停止并删除与前面相同的索引中的列,则不会触发该事件。

下面的代码是react中的实现。这个想法很简单:当拖动开始时,将列顺序存储为colId列表,并在拖动停止时将其与最后的列顺序进行比较。只有在两个订单之间有不同的情况下,事件才会被触发。

代码语言:javascript
运行
复制
function useDragColumnChange(cb: (e: DragStoppedEvent) => void) {
  const columnOrderRef = React.useRef<string[]>([])
  const onDragStarted = (e: DragStartedEvent) => {
    columnOrderRef.current = e.columnApi.getColumnState().map(c => c.colId);
  }
  const onDragStopped = (e: DragStoppedEvent) => {
    const newColumnOrder = e.columnApi.getColumnState().map(c => c.colId);
    const sameOrder = columnOrderRef.current.every(
      (c, i) => c === newColumnOrder[i]
    );

    if (!sameOrder) {
      cb(e);
    }
  }

  return { onDragStarted, onDragStopped };
}

用法

代码语言:javascript
运行
复制
// in render()

const { onDragStarted, onDragStopped } = useDragColumnChange(e => console.log('Saving new column order!'))

return (
  <AgGridReact
    ...
    onDragStarted={onDragStarted}
    onDragStopped={onDragStopped}
  />
);

现场演示

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51488241

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档