找回密码
 立即注册

QQ登录

只需一步,快速开始

TY呀TY

中级会员

71

主题

192

帖子

641

积分

中级会员

积分
641
TY呀TY
中级会员   /  发表于:2022-11-8 17:39  /   查看:3001  /  回复:14
本帖最后由 Lynn.Dou 于 2022-12-9 09:46 编辑

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

14 个回复

倒序浏览
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于: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
您好,
从描述中没太理解您的意思,“如果别人插入行或者删除行,那么我当前自己所撤销的一些操作范围就会 ...

image.png195141600.png image.png887821349.png image.png788452758.png image.png626876830.png 这种有什么办法能够解决呢,因为做协同,自己只能撤销自己所操作的,一旦行列发生改变,自己的撤销堆栈是未发生行列变化之前记录的,执行撤销就会发生这样的问题
回复 使用道具 举报
TY呀TY
中级会员   /  发表于:2022-11-9 11:18:45
地板
Lynn.Dou 发表于 2022-11-8 17:58
您好,
从描述中没太理解您的意思,“如果别人插入行或者删除行,那么我当前自己所撤销的一些操作范围就会 ...

您这边有什么解决方案没呢
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-9 12:17:31
5#
TY呀TY 发表于 2022-11-9 11:18
您这边有什么解决方案没呢

如果想实现协同,undo、redo栈需要您自己来维护,来记录不同用户执行的操作,便于后续撤销的区分。具体协同撤销的实现机制,属于客户自己开发实现的业务逻辑,这边也没有更好的建议了。
您可以依据当前问题整理一个可复现的demo,这边在您代码基础上调研看看是否有可行的方案。
回复 使用道具 举报
TY呀TY
中级会员   /  发表于:2022-11-9 15:37:12
6#
Lynn.Dou 发表于 2022-11-9 12:17
如果想实现协同,undo、redo栈需要您自己来维护,来记录不同用户执行的操作,便于后续撤销的区分。具体协 ...

这是demo

undoDemo.zip

204.95 KB, 下载次数: 57

回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-9 16:54:01
7#


根据代码来看,原因是撤销栈里存储的就是原始的单元格索引,所以撤销时也是随着原始单元格索引实现的。
插入行的行为并不会引起undoOperateList已存储的命令row、col随之更新,
所以有个思路您可以参考下:在插入行/列时判断引起的变动单元格索引,再在undoOperateList中做相应的修改,使row、col可以对应上目标单元格。
image.png797879028.png
回复 使用道具 举报
TY呀TY
中级会员   /  发表于:2022-11-9 17:07:14
8#
Lynn.Dou 发表于 2022-11-9 16:54
根据代码来看,原因是撤销栈里存储的就是原始的单元格索引,所以撤销时也是随着原始单元格索引实现的。 ...

修改后依然也没有用,这个之前尝试过
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-9 17:40:51
9#
本帖最后由 Lynn.Dou 于 2022-11-28 10:39 编辑
TY呀TY 发表于 2022-11-9 17:07
修改后依然也没有用,这个之前尝试过

好的,协同这块比较复杂,这边一时也没有更好的想法了,我再调研看看,有新的进展在贴中回复您。(SJS-16005)
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-12-20 16:20:22
10#
更新进展:

经调研,只有命令可以支持undo/redo,所以需要将代码修改如下:
  1. var commandManager = this.designerSpread.commandManager();
  2.       commandManager.execute({cmd:"gc.spread.contextMenu.insertRows",sheetName:"Sheet1",selections:[new GC.Spread.Sheets.Range(3,-1,2,-1)]})
复制代码

image.png559744872.png
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部