找回密码
 立即注册

QQ登录

只需一步,快速开始

写BUG的程序员

初级会员

29

主题

91

帖子

316

积分

初级会员

积分
316
写BUG的程序员
初级会员   /  发表于:2024-9-3 18:28  /   查看:229  /  回复:19
1金币
本帖最后由 写BUG的程序员 于 2024-9-3 18:32 编辑

通过如下API:
const cm = spread.commandManager()
cm.addListener('myListener', (com) => {
      if (com.actionType === 0) {
      }
    })



actionType都有哪些值,目前看有0: 正常操作, 1:撤销  2: 重做。 请问一下,还有其他的取值吗?

第二个问题: 上面事件里记录的com.command 是否都可以通过spread.commandManager().execute() 方法还原?

19 个回复

倒序浏览
Wilson.Zhang
超级版主   /  发表于:2024-9-4 09:32:17
沙发
您好!关于问题一:一般地,执行命令后可能存在撤销,撤销后可能又需要恢复,围绕这三种操作场景定义了actionType的三种取值:正常操作(0),撤销(1),恢复(2)。
关于问题二:spread.commandManager.execute()用以执行某个命令,同时将命令添加至UndoManager以支持撤销操作。您说的“还原”指代的是什么呢?
回复 使用道具 举报
写BUG的程序员
初级会员   /  发表于:2024-9-4 10:23:36
板凳
本帖最后由 写BUG的程序员 于 2024-9-4 11:00 编辑
Wilson.Zhang 发表于 2024-9-4 09:32
您好!关于问题一:一般地,执行命令后可能存在撤销,撤销后可能又需要恢复,围绕这三种操作场景定义了acti ...

比如说把某个操作的command对象存起来,在一个新的报表中使用spread.commandManager.execute()把存储的command,在新报表中执行,目前测试单元格编辑、插入表格和图表可以用这中方式执行,就是想问一下,是否所有的操作都可以。

但是公式拖拽、复制粘贴,有监听到command,但是这两个操作的command无法通过execute复原


具体实现demo如附件

demo.zip

8.12 MB, 下载次数: 2

回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-4 13:33:16
地板
写BUG的程序员 发表于 2024-9-4 10:23
比如说把某个操作的command对象存起来,在一个新的报表中使用spread.commandManager.execute()把存储的co ...

有点儿不明白为什么要存储command呢?无论是SpreadJS原生支持的命令,还是自定义命令,都可以通过sperad.commandManager().execute()执行命令。
回复 使用道具 举报
写BUG的程序员
初级会员   /  发表于:2024-9-4 16:46:38
5#
本帖最后由 写BUG的程序员 于 2024-9-4 16:47 编辑
Wilson.Zhang 发表于 2024-9-4 13:33
有点儿不明白为什么要存储command呢?无论是SpreadJS原生支持的命令,还是自定义命令,都可以通过sperad. ...

目的是为了做自动保存,如果用toJSON直接生成json保存的话,复杂报表可能需要几秒甚至十几秒,做自动保存会影响用户体验,所以,想要通过这种方式实现自动保存,但是发现复制粘贴、公式拖拽等,无法通过command去复原操作,  上面demo中提供了单元格输入和拖拽扩展两个操作的command,结果是单元格输入可以复原,拖拽扩展无法复原
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-4 17:58:26
6#
写BUG的程序员 发表于 2024-9-4 16:46
目的是为了做自动保存,如果用toJSON直接生成json保存的话,复杂报表可能需要几秒甚至十几秒,做自动保存 ...

通过您的描述,您想通过记录操作并根据操作栈中记录的操作对文件进行操作复现以实现实时保存文件吗?如果我的理解存在偏差,需要您详细介绍下需求场景。
回复 使用道具 举报
写BUG的程序员
初级会员   /  发表于:2024-9-4 18:41:23
7#
Wilson.Zhang 发表于 2024-9-4 17:58
通过您的描述,您想通过记录操作并根据操作栈中记录的操作对文件进行操作复现以实现实时保存文件吗?如果 ...

对,是这个意思。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-5 11:05:06
8#
本帖最后由 Wilson.Zhang 于 2024-9-5 11:28 编辑

您好!我们运行了并分析了您提供的demo,以fill命令为例,该命令执行时有startRange和fillRange,将这两个属性的值变换为Range对象即可,如下图所示:
1725505475815.png525997619.png

基于您提供的demo中的index.js文件,同步上图调整了其中的代码,参考附件demo了解详情:

index.js

14.42 KB, 下载次数: 1

回复 使用道具 举报
写BUG的程序员
初级会员   /  发表于:2024-9-5 11:20:14
9#
Wilson.Zhang 发表于 2024-9-5 11:05
您好!我们运行了并分析了您提供的demo,以fill命令为例,该命令执行时有startRange和fillRange,将这两 ...

好的,收到。谢谢您。 有没有直接将外层command对象化的方法, 寻找这个方法的原因是: 有些操作不需要对象化,只需要使用json就能复原,有些操作需要内部特定的处理,目前没办法找到所有需要特殊处理的操作都有哪些,怕有遗漏,所以,有没有提供一个command对象,直接将json传进去就能得到一个可用的command的对象。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2024-9-5 12:21:47
10#
写BUG的程序员 发表于 2024-9-5 11:20
好的,收到。谢谢您。 有没有直接将外层command对象化的方法, 寻找这个方法的原因是: 有些操作不需要对 ...

不客气!您试下JSON.stringify()和JSON.parse(),JSON.stringify()将对象转换为JSON字符串,JSON.parse()可以将合理的JSON数据字符串解析为对应的对象。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部