Angular 批量编辑后更新ag网格单元值

Angular 批量编辑后更新ag网格单元值,angular,ag-grid,ag-grid-angular,Angular,Ag Grid,Ag Grid Angular,我正在尝试更新ag网格,在单元值批量更改之后,而不是一次更改一个值。我知道已经有了一个方法(cellvaluechanged),它可以为您提供与api和colDef一起更改的值。我还尝试了从ag网格粘贴结束,但这只适用于粘贴,如果用户只编辑单元格值而不复制粘贴会怎么样。我试图做的是有一个方法,它将在一两秒钟后被调用,获取ag网格中更改的所有值,以避免多轮到后端。这一问题的可能扩展: Html 如果有人知道如何批量加载在一两秒钟后更改的整个单元格值,而不是发送每个更改的值,这将有很大帮助。请给我一

我正在尝试更新ag网格,在单元值批量更改之后,而不是一次更改一个值。我知道已经有了一个方法(cellvaluechanged),它可以为您提供与api和colDef一起更改的值。我还尝试了从ag网格粘贴结束,但这只适用于粘贴,如果用户只编辑单元格值而不复制粘贴会怎么样。我试图做的是有一个方法,它将在一两秒钟后被调用,获取ag网格中更改的所有值,以避免多轮到后端。这一问题的可能扩展:

Html

如果有人知道如何批量加载在一两秒钟后更改的整个单元格值,而不是发送每个更改的值,这将有很大帮助。请给我一些建议


谢谢

我可以根据评论使用Interval。一旦单元格值更改,就会触发onCellValueChanged事件,从中我得到更改的值、行的Id以及实际的字段名。在值上设置Timeout(),以防有10-20个值粘贴在一起以避免来回的后端调用

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

在最后一步中,组件中声明为false的isCellValueUpdatedboolean将处理对后端的多个调用,对于多个记录的每个实际请求,将执行一次批量加载

    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
          )
        })
    }
  }
onCellValueChanged(参数){
log('Callback onCellValueChanged:',params);
if(参数newValue){
这个.changedValue.push({
字段:params.colDef.field,
newValue:params.newValue.trim(),
id:params.data.id
});
设置超时(()=>{
this.updateCellValues(this.changedValue);
}, 1000);
}
}
私有updateCellValues(值:IGridChangedValues[]){
const changeboolean aftervalueschange=间隔(500);
this.updateDb({values,changeBooleanAfterValuesChange});
}
私有更新的(
{values,changeBooleanAfterValuesChange}:
{values:IGridChangedValues[];changeBooleanAfterValuesChange:Observable;}){
如果(!this.isCellValueUpdated){
this.isCellValueUpdated=true;
此.u studyLevelService.updateCellValuesInDb(values).pipe(takeUntil(this.unsubscribe$).subscribe(
(结果:布尔值)=>{
如果(结果){
}否则{
此._dialogs.alert(新的AlertDialogOptions(
“错误”,
“更新值时出错”);
}
changeBooleanAfterValuesChange.pipe(takeUntil(this.unsubscribe$)。订阅(
()=>this.isCellValueUpdated=false
)
})
}
}

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

我不得不处理类似的情况,但对我有帮助的是,有一个按钮供用户接受批量更新,所以也许你可以妥协并创建一个这样的按钮,一旦它点击,你就可以这样做。
updateCellValuesInDb
。谢谢你的帮助评论。我不愿意添加按钮的唯一原因是,它会带走ag grid excel复制粘贴的美丽。我一直在寻找ag-grid提供的开箱即用的方法/事件。只需使用当前方法(收集内存中的更改),但只允许使用or最多每隔“一秒或两秒”调用
updateCellValuesInDb
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);
    }
  }
    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
          )
        })
    }
  }