在AG网格更新后保持过滤器



我试图在更新行后保留网格的过滤器。

当我单击网格中的一行时,我打开一个对话框,在其中更新该行的信息,然后在网格的 rowData 中查找单击的行,然后我使用对话框中的值更新 rowData 中的相应记录,如下所示:

row[0].x = dg.x;
row[0].y = dg.y;
dg.gridOptions.rowData[index] = row[0];
dg.gridOptions.api.setRowData(newRows);

但是在此之后,我松开了网格上的过滤器,进行了一些搜索,并尝试了以下所有解决方案:

  1. gridOptions属性deltaRowDataMode设置为true

  2. filterParams: {apply: true, newRowsAction: 'keep'}

但这些都没有奏效。

我该如何解决这个问题?

你可以将 filterParams newRowsAction 设置为保留,如下所示

dg.defaultColDef = { filterParams: { newRowsAction: 'keep'}} ;

请参阅 https://www.ag-grid.com/javascript-grid-filtering/index.php

使用此方法 (gridOptions.api.refreshCells()( 代替setRowData。或者,如果需要使用setRowData,请在调用之前保存筛选器模型,并在之后使用以下方法再次应用筛选器:

const model = this.gridOptions.api.getFilterModel();
//some code
this.gridOptions.api.setFilterModel(model);

我遇到了同样的问题,这是我为解决它所做的(有点笨拙(。

  1. 订阅 ag 网格的 rowDataChanged 事件。
(rowDataChanged)="onRowDataChanged($event)"
  1. onRowDataChanged里面放你的过滤逻辑
// Get a reference to the name filter instance
const filterInstance = this.gridApi.getFilterInstance('fieldNameHere');
// Call some methods on Set Filter API that don't apply the filter
filterInstance.setModel({
type: 'contains', // type of filter
filter: 'yourData' // set filter on data
});
// Get grid to run filter operation again
this.gridApi.onFilterChanged();

onRowDataChanged将被触发两次,第一次是在网格清除所有内容时触发,第二次是在重新加载数据时触发。因此,您应该设置一些条件以避免任何错误。

例如,我需要根据刷新后加载的数据设置过滤器,这就是我所做的:

const filtered = this.rowData.filter(x => x.Id === this.Id);
if (filtered.length > 0) {
// Get a reference to the name filter instance
const filterInstance = this.gridApi.getFilterInstance('fieldNameHere');
// Call some methods on Set Filter API that don't apply the filter
filterInstance.setModel({
type: 'contains', // type of filter
filter: filtered[0].name // set filter on data
});
// Get grid to run filter operation again
this.gridApi.onFilterChanged();
}

最新更新