找回密码
 立即注册

QQ登录

只需一步,快速开始

newAll

中级会员

71

主题

190

帖子

753

积分

中级会员

积分
753
newAll
中级会员   /  发表于:2024-2-20 19:53  /   查看:913  /  回复:6
10金币
本帖最后由 newAll 于 2024-2-23 11:21 编辑

产品:SpreadJS
版本:V16.1.4

重写删除事件后,在撤销栈里只有原生的clearValues, 没有myClear, 但我想保留myClear, 不要clearValues
  1. const command = {
  2.   canUndo: true,
  3.   execute: function (context, options, isUndo) {
  4.     const Commands = GC.Spread.Sheets.Commands;
  5.     options.cmd = "changeBackColor";
  6.     if (isUndo) {
  7.       Commands.undoTransaction(context, options);
  8.       return true;
  9.     } else {
  10.       Commands.startTransaction(context, options);

  11.       const sheet = spread.getActiveSheet();
  12.       const selections = sheet.getSelections();
  13.       mutilDeleteCellData(spread, selections);

  14.       Commands.endTransaction(context, options);
  15.       return false;
  16.     }
  17.   },
  18. };

  19. spread.commandManager().register("myClear", command);
  20. spread
  21.   .commandManager()
  22.   .setShortcutKey(
  23.     "myClear",
  24.     GC.Spread.Commands.Key.del,
  25.     false,
  26.     false,
  27.     false,
  28.     false
  29.   );
复制代码


spread.zip

7.32 KB, 下载次数: 42

最佳答案

查看完整内容

您好,这边查了一下您的Demo代码,出现这个问题的原因是因为SpreadJS在编辑单元格的时候会执行editCell命令,然后在EditEnded事件中您又执行了changeBackColor命令,所以重做栈中会存在两次操作。 要解决这个问题,一个可行的方法是重写editCell命令,在这个命令内部增加设置背景色的代码。 但是需要注意的是,如果重写了editCell命令,则需要您自己实现自动格式化功能(将数字识别为Number,将时间字符串识别为时间格式)。 ...

6 个回复

倒序浏览
最佳答案
最佳答案
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-2-20 19:53:18
来自 7#
您好,这边查了一下您的Demo代码,出现这个问题的原因是因为SpreadJS在编辑单元格的时候会执行editCell命令,然后在EditEnded事件中您又执行了changeBackColor命令,所以重做栈中会存在两次操作。

要解决这个问题,一个可行的方法是重写editCell命令,在这个命令内部增加设置背景色的代码。

但是需要注意的是,如果重写了editCell命令,则需要您自己实现自动格式化功能(将数字识别为Number,将时间字符串识别为时间格式)。

以下是一个简单的示例:
  1. let myEditCell = {
  2.   canUndo: true,
  3.   name: "myEditCell",
  4.   execute: function (context, options, isUndo) {
  5.     var Commands = GC.Spread.Sheets.Commands;
  6.     if (isUndo) {
  7.       Commands.undoTransaction(context, options);
  8.       return true;
  9.     } else {
  10.       Commands.startTransaction(context, options);
  11.       let sheet = context.getSheetFromName(options.sheetName);
  12.       let cell = sheet.getCell(sheet.getActiveRowIndex(), sheet.getActiveColumnIndex());
  13.       cell.value(options.newValue);
  14.       cell.backColor("blue")
  15.       Commands.endTransaction(context, options);
  16.       return true;
  17.     }
  18.   },
  19. };

  20. spread.commandManager().register("editCell", myEditCell);
复制代码
SpreadJS 17.0.9 | GcExcel 7.1.2 已发布~
回复 使用道具 举报
newAll
中级会员   /  发表于:2024-2-21 09:29:40
2#
这个问题 只要添加 spread.options.allowUndo = true 后可以把自定义删除添加进去了,但还有个问题,如何可以实现把缓存在前端缓存的撤销栈的数据,在重新打开该表单的时候直接把undoList数据加到改表单里,时它可以继续撤销
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-2-21 09:53:23
3#
您好,目前在undoManager和redoManager公开的接口中仅支持获取撤销和重写的操作,不支持手动设置撤销重做栈。
SpreadJS 17.0.9 | GcExcel 7.1.2 已发布~
回复 使用道具 举报
newAll
中级会员   /  发表于:2024-2-22 20:27:43
4#
Joestar.Xu 发表于 2024-2-21 09:53
您好,目前在undoManager和redoManager公开的接口中仅支持获取撤销和重写的操作,不支持手动设置撤销重做栈 ...

老师您好, 我们的数字单元格是在编辑后通过setValue和backColor 设置了格式和样式,我以上方的添加命令的方式,可以把api的操作加入undo列表里,但是在撤销栈里会出现两条数据,一条是自带的editCell,一条是我自定义的,这样通过ctrl+z就需要两次才能撤销用户的一次编辑了,这个有办法解决吗
回复 使用道具 举报
Joestar.XuSpreadJS 开发认证
超级版主   /  发表于:2024-2-23 10:23:28
5#
您好,涉及到Command的问题比较复杂,请您提供一个可以复现出您问题的Demo,我们这边结合实际代码调研一下,看是否有解决方案。
SpreadJS 17.0.9 | GcExcel 7.1.2 已发布~
回复 使用道具 举报
newAll
中级会员   /  发表于:2024-2-23 11:21:57
6#
Joestar.Xu 发表于 2024-2-23 10:23
您好,涉及到Command的问题比较复杂,请您提供一个可以复现出您问题的Demo,我们这边结合实际代码调研一下 ...

以上传
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部