找回密码
 立即注册

QQ登录

只需一步,快速开始

TY呀TY

中级会员

71

主题

192

帖子

641

积分

中级会员

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

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

14 个回复

正序浏览
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-1-11 12:06:58
15#
本帖最后由 Lynn.Dou 于 2023-3-2 17:32 编辑

更新进展:
涉及到行列等结构性的变动时,两种思路:
1、完全记录所有的行为,即撤销是无上限的。这种方式下两种思路:
(1)undoTransaction (用tag标记新的行列位置,但是为什么修改row索引后,撤销的仍是原位置,这个目前还在调研中)
        更新调研进展:
        SpreadJS中单元格的选中状态与value的绘制并不在一层(双层画布),撤销行为引起的变动经调研目前无法通过代码完整控制,简单来说不建议用户使用这种”撤 销无上限思路“,建议使用思路2:遇到结构性变化时,清空undo/redo栈,此时不允许再撤销。
(2)不使用undoTransaction,用API(如clear)模拟撤销行为。需要对所有的行为做预判,比较复杂
2、当遇到结构性变化时,清空undo/redo栈,此时不允许再撤销。
即如果用户做了插入/删除行操作时,栈被清空,就不能再撤销了,撤销是有限的。这种方式实现比较简单,且也是目前很多协同客户被建议在用的方案。


回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-12-27 15:59:54
14#
问题正在调研中,有进展会贴中通知您。
回复 使用道具 举报
TY呀TY
中级会员   /  发表于:2022-12-27 14:46:04
13#
Lynn.Dou 发表于 2022-12-26 18:34
是别人做的插入行操作,您不能去撤销,这样理解对吗?
这边调研看看是否有可行方案, 有进展贴中回复您。

是的
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-12-26 18:34:04
12#
是别人做的插入行操作,您不能去撤销,这样理解对吗?
这边调研看看是否有可行方案, 有进展贴中回复您。
回复 使用道具 举报
TY呀TY
中级会员   /  发表于:2022-12-26 17:26:44
11#
Lynn.Dou 发表于 2022-12-20 16:20
更新进展:

经调研,只有命令可以支持undo/redo,所以需要将代码修改如下:

我的意思是别人操作的我不去撤销,可能你理解错了
回复 使用道具 举报
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
回复 使用道具 举报
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)
回复 使用道具 举报
TY呀TY
中级会员   /  发表于:2022-11-9 17:07:14
8#
Lynn.Dou 发表于 2022-11-9 16:54
根据代码来看,原因是撤销栈里存储的就是原始的单元格索引,所以撤销时也是随着原始单元格索引实现的。 ...

修改后依然也没有用,这个之前尝试过
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-11-9 16:54:01
7#


根据代码来看,原因是撤销栈里存储的就是原始的单元格索引,所以撤销时也是随着原始单元格索引实现的。
插入行的行为并不会引起undoOperateList已存储的命令row、col随之更新,
所以有个思路您可以参考下:在插入行/列时判断引起的变动单元格索引,再在undoOperateList中做相应的修改,使row、col可以对应上目标单元格。
image.png797879028.png
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部