如何在行删除后升级/刷新 ag-grid?

Posted

技术标签:

【中文标题】如何在行删除后升级/刷新 ag-grid?【英文标题】:How to upgrade/refresh the ag-grid after row delete? 【发布时间】:2016-05-20 13:26:13 【问题描述】:

我有一个 ag 网格,我试图在其中删除一行...我可以使用“拼接”技术从数据源中删除该行,之后我想刷新表格。但它显示错误。这是我用来删除一行的代码

selectedvalue= //this holds the selected row value
rowData=[]; //this holds all the row data
onRowSelected(event) 
  this.selectedvalue = event;
 
deletebtn() 
    for (let i = 0; i < this.rowData.length; i++) 
        if (this.selectedvalue.node.data.make === this.rowData[i].make) 
            this.rowData.splice(i, 1);
            this.gridOptions.api.refreshView();
        
    

它显示类似这样的错误-->无法读取未定义的属性'refreshView'...如何查看行删除后表中所做的更改。

【问题讨论】:

【参考方案1】:

编辑:此解决方案适用于版本 3.3.x(更新的 plnkr 链接)

您应该再次将行设置到网格中: 拼接后:

gridOptions.api.setRowData(gridOptions.rowData)

也许这个 plunkr 可以帮助https://plnkr.co/plunk/0k4sYa

ag-grid 的作者在 ag-grid 论坛中解释了这一点 该论坛已不存在

【讨论】:

呃,你能提供一个指向 ag-grid 论坛的链接吗?我已经注册但我不是企业用户,所以也许这就是我无法正确搜索该解释的原因。 我也不是企业用户。但是,您仍然可以在没有人的情况下搜索论坛。喜欢这个ag-grid.com/forum/… 谢谢!我无法在论坛中找到它,但事实证明答案并不完全是最新的。请参阅下面@user3294566 的答案。但是,对于 2016 年早期版本的 agGrid,您的答案是正确的;较新的版本只是具有更好的 API 调用,可以轻松完成行的删除和后续刷新。 Plunker是404 :-(gridOptions.api.setRowData(gridOptions.rowData)够用吗,还是以后有必要gridOptions.api.refreshClientSideRowModel() 嗨@MawgsaysreinstateMonica。我已经更新了 plnkr 链接,plnkr 更改了链接方法。请参阅 setRowData 的脚本,至于那个 ag-grid 版本,它是唯一需要的。请注意 Gwyneth 提到的 ag-grid 版本。【参考方案2】:

文档中描述了一种更有效的方法:Transaction Update API。

删除行后必须使用api.applyTransaction方法:

gridOptions.api.applyTransaction( remove: [array of rows you have deleted]);

例如只删除了一行:

gridOptions.api.applyTransaction( remove: [this.rowData[i]])

使用此方法,网格将仅更新参数中的行并保留所有其他视图状态(顺序,...)。

为了完成答案,还有参数可以在添加或修改一行或多行时更新网格。

添加时:

gridOptions.api.applyTransaction( add: [array of rows you have added]);

修改时:

gridOptions.api.applyTransaction( update: [array of rows you have changed]);

备注:对于旧版本的 AG Grid,方法是 api.updateRowData 而不是 api.applyTransaction

【讨论】:

属性 gridOptions 不存在 updateRowData() 替换为applyTransaction()【参考方案3】:

为了获得更好的性能,请使用网格 api 调用来添加/删除行。 在开头插入一行,即所选行的副本:

var rowData = JSON.parse(JSON.stringify(selectedNode.data));
gridOptions.api.insertItemsAtIndex(0, [rowData]);

要删除选定的行:

var selectedNodes = gridOptions.api.getSelectedNodes();
gridOptions.api.removeItems(selectedNodes);

请仅在原始行的深层副本之后插入新行。 否则,api 会继续引用同一行。 因此,随后删除新行,将从网格中删除原始行。

api详情请参考文档。https://www.ag-grid.com/javascript-grid-insert-remove/

【讨论】:

你没有在插入的任何地方使用newRow...相反,你有rowData。我想你需要改变它。 感谢您的回答!虽然现在对我来说很明显,但 agGrid 的工作方式在 2017 年中期发生了变化——最初的问题是在 2016 年提出的——我实际上有一个 过时 版本的 agGrid,你自己的答案(这对于当前版本的 agGrid 是正确的!)不起作用,即 JS 控制台因缺少 API 函数而出现一些错误。确实,您的回答(我已赞成 :-))是完成 OP 所要求的更正确、最新的方法 - no 需要提供 all i> 再次将行移至 agGrid,就像 2016 年初的情况一样。【参考方案4】:

$events.refreshInfiniteCache();

您可以简单地使用它来更新您的网格

【讨论】:

【参考方案5】:

更新 aggrid 特定单元格中的数据

        let rowNode = f.gridApi.getRowNode(f.id);  // use to find the rowNode
        rowNode.setDataValue('myPrice','1000') // update the datavalue in the price cell

f 是 aggrid 的当前节点

【讨论】:

【参考方案6】:

为较新版本的 agGrid 更新了答案。

从版本23.1.0+:使用applyTransaction(transaction)

gridApi.applyTransaction( remove: rowArray );

// similarly you can add or update using transaction
gridApi.applyTransaction( update: rowArray);
gridApi.applyTransaction( add: rowArray);

其中rowArray 是一个行数据数组。可以从RowNode.data 访问现有的行数据。

示例

onRemoveFirst() 
  const firstRow = this.gridApi.getRenderedNodes()[0].data;

  if (!firstRow) return;
  this.gridApi.applyTransaction( remove: [firstRow] );


onRemoveSelected() 
  const selectedData = this.gridApi.getSelectedRows();
  this.gridApi.applyTransaction( remove: selectedData );


onThanos() 
  const itemsToRemove = [];

  this.gridApi.forEachNodeAfterFilterAndSort((rowNode) => 
    const shouldThanos = randomBetween(1, 100) <= 50;

    if (shouldThanos) 
      itemsToRemove.push(rowNode.data);
    
  );
  this.gridApi.applyTransaction( remove: itemsToRemove );

现场演示

【讨论】:

applyTransaction 没有更新底层数据数组。如何获取完整的数据集(包括修改)对此有何想法?

以上是关于如何在行删除后升级/刷新 ag-grid?的主要内容,如果未能解决你的问题,请参考以下文章

删除firebase中的数据后如何刷新TableViewCell?

如何防止刷新后表单服务被删除?

C# - 删除行后如何刷新 DataGridView

如何在swift中删除行后刷新tableview?

WPF TreeView - 如何在添加/删除节点后刷新树?

如何使 rsyslogd 刷新其缓冲区