找回密码
 立即注册

QQ登录

只需一步,快速开始

Shawn_Lydia

注册会员

11

主题

28

帖子

111

积分

注册会员

积分
111
Shawn_Lydia
注册会员   /  发表于:2023-5-6 11:06  /   查看:1082  /  回复:5
5金币
本帖最后由 Shawn_Lydia 于 2023-5-6 11:06 编辑

您好,有个问题想请教一下
image.png828333129.png
画面有按钮调用方法a(),具体方法如下所示,计算结果有误差
同样的场景,将toJSON替换为fromJSON就可以正常计算
我想知道这其中的原因,为什么fromJSON之后可以正常计算,toJSON之后不行



fromJSON之后有是否其按需计算,在fromJSON之后好用
spread.options.calcOnDemand = true;

在toJSON之后我也尝试加过是否按需计算,在toJSON之后不好用




a() {
        let spread = this.spread;
        暂停描绘
        挂起事件
        spread.suspendCalcService(false);
        spread.toJSON({includeBindingSource: true});
        spread.resumeCalcService(true);
        唤醒事件
        恢复描绘
        this.b();
    }

    b() {
        let spread = this.spread;
        暂停描绘
        挂起事件
        spread.suspendCalcService(false);
        getActiveSheet()获取当前sheet页
        setValue()给单元格A2赋值‘1’
        setValue()给单元格B2赋值‘2’
        getValue()控制台打印C2的值‘0’
        setTimeout五秒后,getValue()控制台打印C2的值‘3’,控制台结果如下图所示
        spread.resumeCalcService(true);
        唤醒事件
        恢复描绘
    }

image.png649747619.png




最佳答案

查看完整内容

toJSON()前后加挂起和恢复是因为模板太大,toJSON()耗时太长,如果去掉挂起和恢复,确实可以正确计算,但是toJSON()效率太低了 这点我不赞同,因为前端正常情况下公式是实时计算结果的。所以原理上tojson跟挂起和恢复没有任何关系。挂起和恢复也不会节约tojson的性能。 但是有一点值得怀疑的是去掉挂起和恢复,确实可以正确计算,也就是说你挂起和恢复导致了公式计算结果不正确。 从这里可以怀疑你这边应该是采取了某些做法,让 ...

5 个回复

倒序浏览
最佳答案
最佳答案
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-5-6 11:06:48
来自 4#
toJSON()前后加挂起和恢复是因为模板太大,toJSON()耗时太长,如果去掉挂起和恢复,确实可以正确计算,但是toJSON()效率太低了
这点我不赞同,因为前端正常情况下公式是实时计算结果的。所以原理上tojson跟挂起和恢复没有任何关系。挂起和恢复也不会节约tojson的性能。
但是有一点值得怀疑的是去掉挂起和恢复,确实可以正确计算,也就是说你挂起和恢复导致了公式计算结果不正确。
从这里可以怀疑你这边应该是采取了某些做法,让公式变成了不是实时计算的。
如果这么推断,那么上面的说法完全成立,因为如果公式不是实时计算的。那么你在tojson之前挂起了公式计算引擎就会导致计算引擎暂时失效,又因为你不是实时计算的。所以当前显示的结果并非最新的计算结果,这个时候tojson,那么ssjson中的计算结果就是错误的。等你恢复计算后相当于要重新计算一次,那么重新计算一遍后结果为正确结果。
如果你那边真实情况是这样子,那么只能说产品目前设计就是如此,如果你这么用就会导致这样的问题。
当然,有一些地方我是不确定的,就是你那边是不是像我说的通过某些方法使公式由实时计算变成了手动计算。(但从你的描述来看,目前的情况符合手动计算的行为)
这也是我为什么要问你提供能够重现问题的demo,我们详细调查的原因。如果不能提供的话,也只能大概猜一下了
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-5-6 18:52:06
2#
什么叫把tojson替换成fromjson,tojson是序列化,from是反序列化两者是相反操作。
tojson是不会影响目前页面上的表格公式计算的,换言之你做不做这个操作跟计算结果压根没关系。
如果真实的代码就是按照您上面说的这样,没有其他操作的话,那么下图所示的这些代码没有任何意义
image.png628780212.png
所以建议您给一个demo吧,根据demo我看看您实际代码具体是如何操作的,再回复您这个问题是怎么回事。
回复 使用道具 举报
Shawn_Lydia
注册会员   /  发表于:2023-5-8 09:38:16
3#
Clark.Pan 发表于 2023-5-6 18:52
什么叫把tojson替换成fromjson,tojson是序列化,from是反序列化两者是相反操作。
tojson是不会影响目前页 ...

您好,因为信息安全问题,这已经是我最大限度恢复代码了,不好意思啊,我说明一下,就是在fromJSON之后,同样调用了b()方法,控制台前后两次打印结果是正确的,toJSON()前后加挂起和恢复是因为模板太大,toJSON()耗时太长,如果去掉挂起和恢复,确实可以正确计算,但是toJSON()效率太低了
回复 使用道具 举报
Shawn_Lydia
注册会员   /  发表于:2023-5-8 13:15:24
5#
Clark.Pan 发表于 2023-5-8 09:56
toJSON()前后加挂起和恢复是因为模板太大,toJSON()耗时太长,如果去掉挂起和恢复,确实可以正确计算,但是 ...

谢谢,我们项目有一个模块是嵌入js,这块确实会涉及到手动计算,如果说不会影响性能,暂时就先去掉挂起和恢复,麻烦您了
回复 使用道具 举报
Clark.Pan讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2023-5-8 16:48:56
6#
不客气,那就结贴了,有什么问题欢迎另开新帖进行询问。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部