找回密码
 立即注册

QQ登录

只需一步,快速开始

Lynn.Dou 讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-3-31 17:50  /   查看:3489  /  回复:0

在之前的教程中,有介绍 如何通过公式追踪来监听公式值的变动
除了公式追踪,还有什么方法能监听公式值得变动呢?
本篇文章带领大家学习如何使用脏数据来实现监听公式值变动得需求。

1、脏数据是什么?
在学习指南中有详细介绍脏数据的概念,大家可以点击下方链接了解详情
https://demo.grapecity.com.cn/sp ... s/edit/dirty-items#
在单元格的值发生变化时,我们可以调用 getDirtyCells 方法来获取脏单元格。

2、步骤(以附件的demo为例)
1)监听ValueChanged事件,当公式引用的单元格值变动时,会触发此事件。
  1. sheet.bind(GC.Spread.Sheets.Events.ValueChanged, function (e, info) {
  2.                 console.log(info.row +"," + info.col + "," + "由" + info.oldValue + "改变为" + info.newValue);
  3.             });
复制代码
image.png582373961.png

2)这个时候我们获取脏单元格,会发现 公式值仅在第一次变动时被记录下来,后续变动无法监听到。
所以我们要使用 clearPendingChanges 从当前表单中清除脏数据,具体使用方法请参考下方API链接:
https://demo.grapecity.com.cn/sp ... clearPendingChanges
https://demo.grapecity.com.cn/sp ... arPendingChangeType

  1. sheet.bind(GC.Spread.Sheets.Events.ValueChanged, function (e, info) {
  2.                 console.log(info.row +"," + info.col + "," + "由" + info.oldValue + "改变为" + info.newValue);
  3.                 var arr = sheet.getDirtyCells(-1,-1,-1,-1);
  4.                 console.log(arr);
  5.                 sheet.clearPendingChanges({clearType: 1, row: -1, rowCount: -1, col: -1, colCount: -1});
  6.             });
复制代码
3)再次运行测试,虽然公式值的变动每次都被监听到,但无法获取到变动后的值。(newValue总是延迟了一步,获取到的是上一次的值)
这是因为 ValueChanged 事件还未执行完毕,此时公式值还未更改。
所以需要使用 setTimeout 方法异步执行获取脏数据的代码:
  1. sheet.bind(GC.Spread.Sheets.Events.ValueChanged, function (e, info) {
  2.                 console.log(info.row +"," + info.col + "," + "由" + info.oldValue + "改变为" + info.newValue);
  3.                 setTimeout(() => {
  4.                     var arr = sheet.getDirtyCells(-1,-1,-1,-1);
  5.                     console.log(arr);
  6.                     sheet.clearPendingChanges({clearType: 1, row: -1, rowCount: -1, col: -1, colCount: -1});
  7.                 }, 0);
  8.                
  9.             });
复制代码
这时再运行就可以成功监听到公式值的变动了。
image.png429922179.png

0 个回复

您需要登录后才可以回帖 登录 | 立即注册
返回顶部