在SpreadJS的脏数据机制中,有一个接口是worksheet.getDeleteRows(); ,这个方法可以获取到被用户删除掉的行记录。但只有在表单级别的绑定时,才能获取到具体被删除的行的内容(key - value形式),而表格绑定和单元格绑定时,只能拿到删除的行号,是没办法获取到具体删除的内容的。本文旨在解决这个问题,让我们可以获取到被删除行中绑定的数据。
一、切入点:
要获取被删除的内容,必须在删除指令发出后、删除动作执行前触发,否则内容一旦被删除就真的丢失了,难以找回,这里我们采用挂载GC.Spread.Sheets.Events.RowChanging事件的形式监听用户删除行的行为。示例代码:
- // 监听事件:把每次删除行操作都记录到一个deletedRows的实例中
- sheet.bind(GC.Spread.Sheets.Events.RowChanging, function (e, info) {
- console.log(info);
- // 删除的起始行
- var row = info.row;
- // 删除的行数
- var count = info.count;
- // 触发事件的sheet
- var sheet = info.sheet;
- // 记录本次操作的deleteRows信息:
- var rowDataArray = [];
- if(info.propertyName == "deleteRows" && !undoFlag){
-
- }
- });
复制代码 在回调中可以拿到删除行、行数、sheet实例、操作类型(deleteRows)
二、分析绑定关系:
根据bindingPath可以判断删除的行中,是否有绑定单元格或表格数据,参考代码:
- // 如果是正常删除行,拼接对应的内容
- // 遍历单元格,查找是否包含单元格绑定内容
- for(let r = row; r < row+count; r++){
- var rowData = {};
- for(let i=0; i<sheet.getColumnCount(); i++){
- // 记录单元格绑定内容
- let bp = sheet.getBindingPath(r, i);
- rowData.row = r;
- if(bp){
- rowData[bp] = sheet.getValue(r, i);
- }
- // 记录表格绑定内容
- var tables = sheet.tables.all();
- tables.forEach(function(table){
- if(table.dataRange().contains(r, i, 1, 1)){
- let tbindingPath = table.bindingPath();
- if(tbindingPath){
- var tableStartColumn = table.range().col;
- if(!rowData[tbindingPath]){
- rowData[tbindingPath] = {};
- }
- rowData[tbindingPath][table.getColumnDataField(i - tableStartColumn)] = sheet.getValue(r, i);
- }
- }
- });
- }
- rowDataArray.push(rowData);
- }
- deletedRows.push(rowDataArray);
复制代码
三、重写Undo方法:
当撤销操作时,需要能够维护历史信息。
- // 重写Undo方法:阻止undo时触发RowChanging
- var undoManager = spread.undoManager();
- var oldUndo = undoManager.undo;
- var undoFlag = false;
- undoManager.undo = function () {
- undoFlag = true;
- return oldUndo.apply(this, arguments);
- };
- sheet.bind(GC.Spread.Sheets.Events.RowChanged, function (e, info) {
- console.log(info);
- if(info.isUndo){
- deletedRows.pop();
- // 标记undo结束
- undoFlag = false;
- }
- });
复制代码
完整示例请参考附件。
|
|