找回密码
 立即注册

QQ登录

只需一步,快速开始

Dtttax

高级会员

235

主题

571

帖子

1842

积分

高级会员

积分
1842
Dtttax
高级会员   /  发表于:2023-2-24 13:55  /   查看:992  /  回复:9
1金币
本帖最后由 Dtttax 于 2023-2-24 14:06 编辑

如下代码,调用click方法。 做一个功能方法,传入一个方法,然后注册后不能ctrl+z撤回, 但是看执行又进入了undoTransaction。

click(){
       this.undoExt(this.setCellValue,this.spread);
    },

  setCellValue(){
    let spread=this.spread;
    let sheet=spread.getActiveSheet();
    let cell=sheet.getCell(10,2);
    cell.value(100);
    cell.backColor("red");
   },

undoExt(fun,spread){
    let commandManager = spread.commandManager();
     let command = {
          canUndo: true,
          execute: function(spread, options, isUndo) {
              let Commands = GC.Spread.Sheets.Commands;
              if (isUndo) {
                  Commands.undoTransaction(spread, options);
                  return true;
              } else {
                  Commands.startTransaction(spread, options);
                  fun.apply(this, arguments);
                  Commands.endTransaction(spread, options);
                  return true;
              }
          }
      };
                commandManager.register("undoExt", command);
                commandManager.execute({
                    cmd: "undoExt",
                    spread:spread
                });

},


最佳答案

查看完整内容

您好,应该这么写:

9 个回复

倒序浏览
最佳答案
最佳答案
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-2-24 13:55:38
来自 2#
您好,应该这么写:
  1. spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"));
  2.             
  3.                         let commandManager = spread.commandManager();
  4.                         let command = {
  5.                                 canUndo: true,
  6.                                 execute: function(context, options, isUndo) {
  7.                                         let Commands = GC.Spread.Sheets.Commands;
  8.                                         if (isUndo) {
  9.                                                 Commands.undoTransaction(context, options);
  10.                                                 return true;
  11.                                         } else {
  12.                                                 Commands.startTransaction(context, options);
  13.                                                 let sheet = context.getSheetFromName(options.sheetName);
  14.                                                 let cell=sheet.getCell(10,2);
  15.                                                 cell.value(100);
  16.                                                 cell.backColor("red");
  17.                                                 Commands.endTransaction(context, options);
  18.                                                 return true;
  19.                                         }
  20.                                 }
  21.                         };
  22.                         commandManager.register("undoExt", command);
  23.                         commandManager.execute({
  24.                                 cmd: "undoExt",
  25.                                 sheetName: spread.getActiveSheet().name()
  26.                         });
复制代码
回复 使用道具 举报
Dtttax
高级会员   /  发表于:2023-3-2 11:41:44
3#
Clark.Pan 发表于 2023-2-24 18:30
您好,应该这么写:

Commands.startTransaction(context, options);
后面不能调用一个函数吗?
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-3-2 14:10:34
5#
本帖最后由 Clark.Pan 于 2023-3-2 14:12 编辑

你之前的做法代码会导致ctrl+z的时候执行上有问题,ctrl+z的时候执行上会有问题。所以不允许。
回复 使用道具 举报
Dtttax
高级会员   /  发表于:2023-3-6 14:22:39
6#
Clark.Pan 发表于 2023-3-2 14:10
你之前的做法代码会导致ctrl+z的时候执行上有问题,ctrl+z的时候执行上会有问题。所以不允许。

如果有大量的方法需要支持撤回,必须每个方法都这样包一层吗?有没有什么好的方式?
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-3-6 16:15:13
7#
是的,command本身的机制本身就是如此,先要去注册。而不是你这样再调用的时候去传对应的方法。
回复 使用道具 举报
Dtttax
高级会员   /  发表于:2023-3-8 15:34:47
8#
还是不行,代码是spreadjs demo中 vue2 的样例加的方法,点击click按钮。

WorkSheet.zip

1.99 KB, 下载次数: 41

回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-3-8 18:32:43
9#
sheetName: spread.getActiveSheet().name()是必传项,这里写的不对
image.png462007750.png
image.png201395568.png
回复 使用道具 举报
Dtttax
高级会员   /  发表于:2023-3-9 09:51:53
10#
可以了,实际调用一个函数也是可以的,就是少传了参数sheetName。
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-3-9 18:40:15
11#
好的,有其他问题可以再发新帖沟通
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部