angular - 如何在 Angular 轮询期间保持过滤器完好无损?

标签 angular angular-material ag-grid polling ag-grid-angular

<div class="device-view">
  <mat-toolbar>
    <span class="device-list-label">Device List</span>
  </mat-toolbar>
  <div class="device-list">
    <ag-grid-angular
      style="width: 100%; height: 100%;"
      class="ag-theme-material"
      (gridReady)="onGridReady($event)"
      [suppressDragLeaveHidesColumns]="true"
      [frameworkComponents]="frameworkComponents"
      (columnResized)="onColumnResized($event)"
      [rowData]="rowData"
      [columnDefs]="columnDefs"
      [defaultColDef]="defaultColumnDefs"
      [enableSorting]="true"
      [enableFilter]="true"
      [animateRows]="true"
      [rowHeight]="32"
      [headerHeight]="35"
      [suppressRowClickSelection]="true"
      [rowSelection]="rowSelection"
      (selectionChanged)="onSelectionChanged()"
      (filterChanged)="onFilterChanged($event)"
      [modules]="modules"
    </ag-grid-angular>
  </div>
</div>

这是我的轮询代码。我正在 ngOnit() 中调用 update 方法。

update(){
this.timeInterval = interval(10000)
  .pipe(
    startWith(0),
    switchMap(() => this.deviceService.getDeviceList())
  )
  .pipe(
    takeUntil(this.deviceService.flag$),
    repeatWhen(() => this.deviceService.flag$)
  )
  .subscribe((success: any) => {
    this.gridApi?.setRowData(this.updatedData);
    this.restoreFilterModel(); 
    this.updatedData = success;
    console.log("test")
  }, retry(2));
}

这些是在新数据到来时恢复过滤器状态并应用过滤器模型的方法。

saveFilterModel() {
    this.savedFilterModel1 = this.gridApi.getFilterModel();
    const keys = Object.keys(this.savedFilterModel1);
    const savedFilters = keys.length > 0 ? keys.join(', ') : '(none)';
    document.querySelector('#savedFilters').innerHTML = savedFilters;
}

onFilterChanged(event: any) {
  this.savedFilterModel1 = this.gridApi.getFilterModel();
  const keys = Object.keys(this.savedFilterModel1);
  const savedFilters = keys.length > 0 ? keys.join(', ') : '(none)';

}

restoreFilterModel() {
  if (this.gridApi) {
    this.gridApi.setFilterModel(this.savedFilterModel1);
    this.gridApi.refreshClientSideRowModel('filter');
  }
}

问题是有轻微的闪烁,当数据到来时,屏幕首先显示整个数据,然后过滤数据。我该如何避免闪烁。我需要在代码中进行哪些更改?

最佳答案

您正在手动保存和恢复过滤器,您不需要这样做。您缺少的是以下列定义代码:

filterParams: {
    newRowsAction: 'keep'
}

因此,将上述代码添加到您的 defaultColumnDefs 中,以便将其应用于每一列。

来自documentation :

It is recommended that newRowsAction='keep' is set on the filter params to keep existing filter selections when new rows are added

Demo

关于angular - 如何在 Angular 轮询期间保持过滤器完好无损?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66150812/

相关文章:

Angular2 和 RxJS - 缓存接受参数的服务

angular - Angular 2+ 中 ApplicationRef 的用途是什么?

angular - ** 中的错误不是 NgModule

angular - 在 ng2-pdf-viewer 中放大和缩小

angular - react 形式 Angular 。 Mat 日期选择器不会将日期发送到 Firebase

angular - IntelliJ IDEA 显示 matHeaderRowDef 错误

javascript - 如何从 AgEditorComponent 的上下文中聚焦 ag-grid Angular 中的下一个单元格

ag-grid - 将 react-datepicker 与 agGrid 结合使用

javascript - Angular Material - 折叠 Stepper 的非事件步骤

javascript - 将鼠标悬停在未在 ag-grid 中触发的行事件上