防止 Ag-Grid 在数据(NgRx Store)更改时重新渲染

Prevent Ag-Grid from Re-Rendering when Data (NgRx Store) changes

我正在使用 Ag-grid 和 NgRx Store 作为其数据源。数据在我的父组件中处理,并通过 observable (tableData) 传递到我的 table 组件。

<div class="table-wrapper" *ngIf=tableData>
 <ag-grid-angular
    class="ag-theme-balham"
    [columnDefs]="tableData.columnDefs"
    [rowData]="tableData.rowData" 
    [defaultColDef]="defaultColDef"
    [gridOptions]="gridOptions"
    (gridReady)="onGridReady($event)"
    (rowDataChanged)="onRowDataChanged($event)"
    (cellClicked)="cellClicked($)"
    >
 </ag-grid-angular>
</div>

ag-grid 列包含复选框。当用户单击一个单元格时,会发出一个事件,它会更改应用程序的当前状态、单击的复选框和整个 tableData。 因此,UI 按预期反映了这些更改。

 @Input tableData;
 @Output cellValueChanged = new EventEmitter<>();

 constructor() { }

 onGridReady(params: any) {
  this.gridApi = params.api;
  this.gridColumnApi = params.columnApi;

  setTimeout(() => {
   this.gridApi.sizeColumnsToFit();
   }, 1000);
 }

 cellClicked(event) {
  ...
  this.cellValueChanged.emit({ data });
 }

该解决方案的问题在于重新加载整个 table 数据。这会导致 table 调整为 autoColumnWidth,而且,如果我向下滚动 table,滚动条将重置为顶部状态。

正在使用

cellClicked(event) {
  ...
  this.gridApi.updateRowData({ update: data });
}

非常有效,但前提是我不更新应用程序状态。问题是我希望并且需要在每次用户对 table 执行操作时更新应用程序状态,以保持前端和存储数据一致。

如何防止 table 在更新 AppState 后重新呈现?

感谢您的帮助,我找到了解决方案。

使用 NGRX 或 RxJS 的第一步是使用 deltaRowMode。

我的代码的第二个问题是我正在动态创建 columnRefs。当我单击一个单元格时,不仅会重新计算 rowData,还会重新计算 columnRefs。这将导致电网重置。

感谢您的帮助!我学到了很多