TY呀TY 发表于 2022-11-8 17:39:07

撤销机制(SJS-16005)

本帖最后由 Lynn.Dou 于 2022-12-9 09:46 编辑

我想问一下内部的撤销机制是根据单元格位置还是根据别的,如果我把命令的坐标改变了,然后进行撤销,所撤销的位置还是以前的位置,有没有协同撤销的一个demo,各自撤销各自所操作的内容,如果别人插入行或者删除行,那么我当前自己所撤销的一些操作范围就会改变,这个有没有什么办法能够解决

Lynn.Dou 发表于 2022-11-8 17:58:50

您好,
从描述中没太理解您的意思,“如果别人插入行或者删除行,那么我当前自己所撤销的一些操作范围就会改变”
有具体的示例吗,插入或删除行影响了什么操作的范围呢?
您整理一个可复现的demo,这边在代码基础上调研下问题原因。

TY呀TY 发表于 2022-11-8 19:30:53

本帖最后由 TY呀TY 于 2022-11-8 19:41 编辑

Lynn.Dou 发表于 2022-11-8 17:58
您好,
从描述中没太理解您的意思,“如果别人插入行或者删除行,那么我当前自己所撤销的一些操作范围就会 ...
这种有什么办法能够解决呢,因为做协同,自己只能撤销自己所操作的,一旦行列发生改变,自己的撤销堆栈是未发生行列变化之前记录的,执行撤销就会发生这样的问题

TY呀TY 发表于 2022-11-9 11:18:45

Lynn.Dou 发表于 2022-11-8 17:58
您好,
从描述中没太理解您的意思,“如果别人插入行或者删除行,那么我当前自己所撤销的一些操作范围就会 ...

您这边有什么解决方案没呢

Lynn.Dou 发表于 2022-11-9 12:17:31

TY呀TY 发表于 2022-11-9 11:18
您这边有什么解决方案没呢

如果想实现协同,undo、redo栈需要您自己来维护,来记录不同用户执行的操作,便于后续撤销的区分。具体协同撤销的实现机制,属于客户自己开发实现的业务逻辑,这边也没有更好的建议了。
您可以依据当前问题整理一个可复现的demo,这边在您代码基础上调研看看是否有可行的方案。

TY呀TY 发表于 2022-11-9 15:37:12

Lynn.Dou 发表于 2022-11-9 12:17
如果想实现协同,undo、redo栈需要您自己来维护,来记录不同用户执行的操作,便于后续撤销的区分。具体协 ...

这是demo

Lynn.Dou 发表于 2022-11-9 16:54:01



根据代码来看,原因是撤销栈里存储的就是原始的单元格索引,所以撤销时也是随着原始单元格索引实现的。
插入行的行为并不会引起undoOperateList已存储的命令row、col随之更新,
所以有个思路您可以参考下:在插入行/列时判断引起的变动单元格索引,再在undoOperateList中做相应的修改,使row、col可以对应上目标单元格。

TY呀TY 发表于 2022-11-9 17:07:14

Lynn.Dou 发表于 2022-11-9 16:54
根据代码来看,原因是撤销栈里存储的就是原始的单元格索引,所以撤销时也是随着原始单元格索引实现的。 ...
修改后依然也没有用,这个之前尝试过

Lynn.Dou 发表于 2022-11-9 17:40:51

本帖最后由 Lynn.Dou 于 2022-11-28 10:39 编辑

TY呀TY 发表于 2022-11-9 17:07
修改后依然也没有用,这个之前尝试过
好的,协同这块比较复杂,这边一时也没有更好的想法了,我再调研看看,有新的进展在贴中回复您。(SJS-16005)

Lynn.Dou 发表于 2022-12-20 16:20:22

更新进展:

经调研,只有命令可以支持undo/redo,所以需要将代码修改如下:
var commandManager = this.designerSpread.commandManager();
      commandManager.execute({cmd:"gc.spread.contextMenu.insertRows",sheetName:"Sheet1",selections:})

页: [1] 2
查看完整版本: 撤销机制(SJS-16005)