找回密码
 立即注册

QQ登录

只需一步,快速开始

KevinChen 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2020-11-3 18:29  /   查看:2641  /  回复:0
在SpreadJS的脏数据机制中,有一个接口是worksheet.getDeleteRows(); ,这个方法可以获取到被用户删除掉的行记录。但只有在表单级别的绑定时,才能获取到具体被删除的行的内容(key - value形式),而表格绑定和单元格绑定时,只能拿到删除的行号,是没办法获取到具体删除的内容的。本文旨在解决这个问题,让我们可以获取到被删除行中绑定的数据。

一、切入点:
要获取被删除的内容,必须在删除指令发出后、删除动作执行前触发,否则内容一旦被删除就真的丢失了,难以找回,这里我们采用挂载GC.Spread.Sheets.Events.RowChanging事件的形式监听用户删除行的行为。示例代码:

  1.     // 监听事件:把每次删除行操作都记录到一个deletedRows的实例中
  2.     sheet.bind(GC.Spread.Sheets.Events.RowChanging, function (e, info) {   
  3.         console.log(info);
  4.         // 删除的起始行
  5.         var row = info.row;
  6.         // 删除的行数
  7.         var count = info.count;
  8.         // 触发事件的sheet
  9.         var sheet = info.sheet;
  10.         // 记录本次操作的deleteRows信息:
  11.         var rowDataArray = [];
  12.         if(info.propertyName == "deleteRows" && !undoFlag){
  13.             
  14.         }
  15.     });
复制代码
在回调中可以拿到删除行、行数、sheet实例、操作类型(deleteRows)

二、分析绑定关系:
根据bindingPath可以判断删除的行中,是否有绑定单元格或表格数据,参考代码:

  1. // 如果是正常删除行,拼接对应的内容
  2.             // 遍历单元格,查找是否包含单元格绑定内容
  3.             for(let r = row; r < row+count; r++){
  4.                 var rowData = {};
  5.                 for(let i=0; i<sheet.getColumnCount(); i++){
  6.                     // 记录单元格绑定内容
  7.                     let bp = sheet.getBindingPath(r, i);
  8.                     rowData.row = r;
  9.                     if(bp){
  10.                         rowData[bp] = sheet.getValue(r, i);
  11.                     }
  12.                     // 记录表格绑定内容
  13.                     var tables = sheet.tables.all();
  14.                     tables.forEach(function(table){
  15.                         if(table.dataRange().contains(r, i, 1, 1)){
  16.                             let tbindingPath = table.bindingPath();
  17.                             if(tbindingPath){
  18.                                 var tableStartColumn = table.range().col;
  19.                                 if(!rowData[tbindingPath]){
  20.                                     rowData[tbindingPath] = {};
  21.                                 }
  22.                                 rowData[tbindingPath][table.getColumnDataField(i - tableStartColumn)] = sheet.getValue(r, i);
  23.                             }
  24.                         }
  25.                     });
  26.                 }
  27.                 rowDataArray.push(rowData);
  28.             }
  29.             deletedRows.push(rowDataArray);
复制代码


三、重写Undo方法:
当撤销操作时,需要能够维护历史信息。

  1.     // 重写Undo方法:阻止undo时触发RowChanging
  2.     var undoManager = spread.undoManager();
  3.     var oldUndo = undoManager.undo;
  4.     var undoFlag = false;
  5.     undoManager.undo = function () {
  6.         undoFlag = true;
  7.         return oldUndo.apply(this, arguments);
  8.     };


  9.     sheet.bind(GC.Spread.Sheets.Events.RowChanged, function (e, info) {
  10.         console.log(info);
  11.         if(info.isUndo){
  12.             deletedRows.pop();
  13.             // 标记undo结束
  14.             undoFlag = false;
  15.         }
  16.     });
复制代码


完整示例请参考附件。


数据绑定删除行内容获取.zip

4.61 KB, 下载次数: 24

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部