批量编辑后更新 ag-grid 单元格值
Update ag-grid cell values after bulk editing
我正在尝试更新 ag-grid,在单元格值批量更改而不是一次更改一个值之后。我知道已经有一个方法 (cellvaluechanged) 可以为您提供与 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);
}
}
如果有人知道如何批量加载一两秒后更改的整个单元格值而不是发送每个更改的值,将会有很大帮助。请指教
谢谢
我能够根据评论使用 Interval。一旦单元格值发生变化,就会触发 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 的最佳技术
我正在尝试更新 ag-grid,在单元格值批量更改而不是一次更改一个值之后。我知道已经有一个方法 (cellvaluechanged) 可以为您提供与 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);
}
}
如果有人知道如何批量加载一两秒后更改的整个单元格值而不是发送每个更改的值,将会有很大帮助。请指教
谢谢
我能够根据评论使用 Interval。一旦单元格值发生变化,就会触发 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 的最佳技术