批量编辑后更新ag-grid单元格值

时间:2020-03-02 23:59:13

标签: angular ag-grid ag-grid-angular

在单元格值批量更改而不是一次更改一个值之后,我正在尝试更新ag-grid。我知道已经有一个方法(更改了单元值),可以为您提供与api和colDef一起更改的值。我还尝试了从ag-grid粘贴pasteEnd,但这仅适用于粘贴,如果用户仅编辑单元格值而不复制粘贴该怎么办。我正在尝试做的是有一种方法,该方法将在一两秒钟后调用,该方法将获取在ag-grid中更改的所有值,以避免向后端进行多次回合。该问题的可能扩展:How to launch a method after a cell value has been edited in ag-grid?

HTML

<ag-grid-angular [ngStyle]="{'height.px': innerHeight}" #agGridLevel class="ag-theme-balham"
                    [rowData]="rowData" [gridOptions]="gridOptions" [defaultColDef]="defaultColDef" [sideBar]="sideBar"
                    [columnDefs]="columnDefs" [excelStyles]="excelStyles" [rowSelection]="'multiple'"
                    (selectionChanged)="onSelectionChanged()" (rowClicked)="onRowClicked($event)"
                    [suppressCopyRowsToClipboard]="true"
                    [enableRangeSelection]="true"
                    (cellValueChanged)="onCellValueChanged($event)"
                    (gridReady)="onGridReady($event)">
                    >
                </ag-grid-angular>

component.ts文件

P.S。我知道即使超时,该方法仍然会多次调用后端。这只是为了展示我正在尝试做的事情。

onCellValueChanged(params) {
    console.log("Callback onCellValueChanged:", params);
    if (params.newValue) {
      this.changedValue.push({
        field: params.colDef.field,
        newValue: params.newValue.trim(),
        id: params.data.id
      });
      setTimeout(() => {
        this.updateCellValuesInDb(this.changedValue)
      }, 1000);
    }
  }

如果某人知道如何批量加载一到两秒钟后更改的整个单元格值,而不是发送每个更改的值,将有很大帮助。请指教。

谢谢

1 个答案:

答案 0 :(得分:0)

我能够根据评论使用间隔。一旦单元格值发生更改,就会发生onCellValueChanged事件,该事件将触发更改后的值,行的ID和实际的字段名称。这些值上的setTimeout()会发生变化,以防万一将10-20个值粘贴在一起以避免来回后端调用。

更新CellValue然后设置时间间隔(500)。

最后一步,在组件中声明为false的 isCellValueUpdated 布尔值将处理对后端的多次调用,并且每次对多个记录的实际请求都将完成一次批量加载。

    onCellValueChanged(params) {
        console.log('Callback onCellValueChanged:', params);
        if (params.newValue) {
          this.changedValue.push({
            field: params.colDef.field,
            newValue: params.newValue.trim(),
            id: params.data.id
          });
          setTimeout(() => {
            this.updateCellValues(this.changedValue);
          }, 1000);
        }
      }
      private updateCellValues(values: IGridChangedValues[]) {
        const changeBooleanAfterValuesChange = interval(500);
        this.updateDb({ values, changeBooleanAfterValuesChange });
      }


      private updateDb(
    { values, changeBooleanAfterValuesChange }:
      { values: IGridChangedValues[]; changeBooleanAfterValuesChange: Observable<number>; }) {
    if (!this.isCellValueUpdated) {
      this.isCellValueUpdated = true;
      this._studyLevelService.updateCellValuesInDb(values).pipe(takeUntil(this.unsubscribe$)).subscribe(
        (result: boolean) => {
          if (result) {
          } else {
            this._dialogs.alert(new AlertDialogOptions(
              'Error',
              'Error Updating values'));
          }
          changeBooleanAfterValuesChange.pipe(takeUntil(this.unsubscribe$)).subscribe(
            () => this.isCellValueUpdated = false
          )
        })
    }
  }

我希望可以有更好的解决方案来避免间隔和超时,但是我认为这是目前可用于ag-grid的最佳技术