找回密码
 立即注册

QQ登录

只需一步,快速开始

wangyue1

金牌服务用户

28

主题

61

帖子

197

积分

金牌服务用户

积分
197

微信认证勋章

wangyue1
金牌服务用户   /  发表于:2020-5-22 16:01  /   查看:4997  /  回复:10
50金币
通过 spread.commandManage().addListener('asyncListener') 捕获到用户操作执行的指令,发送给协同编辑者去执行此指令以同步进度。
但是指令在执行过程中,会调用捕获到的command的属性的原型链上的方法,比如,在撤销clearValues指令时, 会去调用command.MA[0].undo(),此undo方法在command.MA[0]的原型链上。

在网络通信中,原型链会丢失。在协同编辑接收者这边,是否有方法再构造出相应原型,以成功执行该指令?

最佳答案

查看完整内容

您好,SpreadJS的命令在设计时,就充分考虑到“可序列化”的问题,cmd在序列化后可以在不同终端以相同的行为方式来执行,理论上不存在原型链对cmd执行结果的影响。 不过这个undo栈只能按终端用户来分别维护,客户可能不希望自己的操作被别的用户撤销掉。如果需要维护共同的执行栈,可以在服务器端来实现

10 个回复

倒序浏览
最佳答案
最佳答案
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2020-5-22 16:01:54
来自 2#
您好,SpreadJS的命令在设计时,就充分考虑到“可序列化”的问题,cmd在序列化后可以在不同终端以相同的行为方式来执行,理论上不存在原型链对cmd执行结果的影响。

不过这个undo栈只能按终端用户来分别维护,客户可能不希望自己的操作被别的用户撤销掉。如果需要维护共同的执行栈,可以在服务器端来实现
回复 使用道具 举报
wangyue1
金牌服务用户   /  发表于:2020-5-22 20:07:01
3#
KevinChen 发表于 2020-5-22 18:53
您好,SpreadJS的命令在设计时,就充分考虑到“可序列化”的问题,cmd在序列化后可以在不同终端以相同的行 ...

Uodo Redo的堆栈我们自己处理了。   现在是拿到序列化后的命令后无法执行的问题。   因为执行命令过程中需要调用到命令的参数的原型上的方法
回复 使用道具 举报
wangyue1
金牌服务用户   /  发表于:2020-5-23 11:24:53
4#
KevinChen 发表于 2020-5-22 18:53
您好,SpreadJS的命令在设计时,就充分考虑到“可序列化”的问题,cmd在序列化后可以在不同终端以相同的行 ...

undo执行栈我们自己有处理,现在的问题是,用户undo自己的操作,需要把这个操作的结果同步,在其他编辑者哪里也undo掉这个操作。  现在我们能拿到序列化的命令,在excute这个命令,isUndo参数为true时,执行命令失败。

具体可参考clearValues命令,在undo这个命令的时候,会去调用  command.MA[0]的原型链上的undo方法
回复 使用道具 举报
wangyue1
金牌服务用户   /  发表于:2020-5-23 11:32:26
5#
KevinChen 发表于 2020-5-22 18:53
您好,SpreadJS的命令在设计时,就充分考虑到“可序列化”的问题,cmd在序列化后可以在不同终端以相同的行 ...

目前action基类,看到的只有Sheets.Commands.ActionBase暴露了出来,能被获取。 还有些基于ActionBase的二级base类,这些二级base类,有什么办法能access到么?
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2020-5-25 09:35:57
6#
您好,我理解您的问题,但经过多次尝试发现没办法重现这个问题,您能否提供一个能重现问题的Demo?
回复 使用道具 举报
wangyue1
金牌服务用户   /  发表于:2020-5-25 10:12:39
7#
KevinChen 发表于 2020-5-25 09:35
您好,我理解您的问题,但经过多次尝试发现没办法重现这个问题,您能否提供一个能重现问题的Demo?

复现demo test.html (2.25 KB, 下载次数: 72)

test.html

2.25 KB, 下载次数: 68

回复 使用道具 举报
wangyue1
金牌服务用户   /  发表于:2020-5-25 10:18:06
8#
clearValues只是一个例子,实际上有很多的command,不能传输到其他编辑者去同步执行。
回复 使用道具 举报
KevinChen讲师达人认证 悬赏达人认证 SpreadJS 开发认证
论坛元老   /  发表于:2020-5-25 11:43:51
9#
您好,这个问题确实存在,其实跟command的内部接口倒没有关系,是SpreadJS原生不支持一些命令的同步,除了clearValues,还有一些比如paste之类的操作也是无法同步的,

这和目前command机制有关,暂时还没有好的解决方案,推荐的方案是通过监听事件来同步,

虽然这样需要监听大量的事件,并且事件中需要加判断,但目前没有其它更好的实现思路了,

希望对您有所帮助。
回复 使用道具 举报
bee0060
注册会员   /  发表于:2020-12-14 17:13:56
10#
我们也遇到类似问题。经过调试,发现是changeSheet1, fromRange,fromSheet等实例对象经过JSON.parse之后变成JSON,丢失了部分信息和原型链。这些信息大部分在MA中,有些在其他地方。
解决办法是实现一个自定义的序列化和反序列化方法。 序列化时记录属性的类型,添加到JSON数据中,反序列化时根据获得的类型信息用相应的类重新new或fromJSON出来。反序列化后的对象再拿去execute。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部