找回密码
 立即注册

QQ登录

只需一步,快速开始

Joestar.Xu SpreadJS 开发认证
超级版主   /  发表于:2024-11-25 11:45  /   查看:4  /  回复:0
本帖最后由 Joestar.Xu 于 2024-11-25 12:26 编辑
https://gcdn.grapecity.com.cn/showtopic-227369-1-1.html

很多同学在使用报表时,都会选择使用接口来获取报表的数据,不过,若是使用时接口的数据结构发生了变化,SpreadJS默认情况下不会自动更改,需要使用fetch接口来更新数据结构。


image.png734765319.png

大多数情况下,使用fetch都可以满足需求,然后当数据的结构从多变少时(如原来有三个字段,更新后只有一个字段),使用fetch接口并不能获取正确的结构,原来的字段仍然会保留。

这是因为SpreadJS本身无法分辨字段为null和没有字段返回的结果,所以会尽可能保存所有的字段,但是对于客户来说,显示一个并不存在的字段并不合理,虽然我们可以通过重新配置数据源来刷新,但是并不是很方便。

所以,为了解决这个问题,我们需要针对表的字段属性进行修改和调整,以适应这种变化。

  1. let schemaColumns =
  2.   spread.dataManager().tables["表1"].options.schema.columns;
  3. let columns = spread.dataManager().tables["表1"].columns;
  4. let _data = spread.dataManager().tables["表1"]._dataSource._data;

  5. let map = {};
  6. for (const key in schemaColumns) {
  7.   if (schemaColumns[key].dataName) {
  8.     map[schemaColumns[key].dataName] = key;
  9.   }
  10. }

  11. spread.dataManager().tables["表1"].columns = null;
  12. spread.dataManager().tables["表1"].options.schema.columns = null;
  13. spread
  14.   .dataManager()
  15.   .tables["表1"].fetch(true)
  16.   .then(() => {
  17.     let table = spread.dataManager().tables["表1"];
  18.     for (const key in map) {
  19.       let ifSet = false;
  20.       if (table.columns[key]) {
  21.         ifSet = true;
  22.       }

  23.       delete table.options.schema.columns[key];
  24.       delete table.columns[key];
  25.       delete table._dataSource._data[key];

  26.       if (ifSet) {
  27.         table.options.schema.columns[map[key]] = schemaColumns[map[key]];
  28.         table.columns[map[key]] = columns[map[key]];
  29.         table._dataSource._data[map[key]] = _data[map[key]];
  30.       }
  31.     }
  32.     designer.refresh();
  33.   });
复制代码

提示:代码中使用了内置对象,请在使用前酌情慎重考虑这可能会带来的风险,如果你不确定自己在做什么,请勿使用此代码。

以上代码针对“表1”进行了“字段刷新”的操作,先是针对存在dataName的字段设置了缓存,然后清空字段数据并重新获取,再根据之前的缓存重新设置字段信息,以实现刷新的效果。

这段代码只是一个简单的演示,如果有其他的需求,请大家自行根据接口文档实现。

0 个回复

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