Joestar.Xu 发表于 5 天前

当ReportSheet的数据源变化后如何刷新数据源

本帖最后由 Joestar.Xu 于 2024-11-25 12:26 编辑

https://gcdn.grapecity.com.cn/showtopic-227369-1-1.html
很多同学在使用报表时,都会选择使用接口来获取报表的数据,不过,若是使用时接口的数据结构发生了变化,SpreadJS默认情况下不会自动更改,需要使用fetch接口来更新数据结构。




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

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

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

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

let map = {};
for (const key in schemaColumns) {
if (schemaColumns.dataName) {
    map.dataName] = key;
}
}

spread.dataManager().tables["表1"].columns = null;
spread.dataManager().tables["表1"].options.schema.columns = null;
spread
.dataManager()
.tables["表1"].fetch(true)
.then(() => {
    let table = spread.dataManager().tables["表1"];
    for (const key in map) {
      let ifSet = false;
      if (table.columns) {
      ifSet = true;
      }

      delete table.options.schema.columns;
      delete table.columns;
      delete table._dataSource._data;

      if (ifSet) {
      table.options.schema.columns] = schemaColumns];
      table.columns] = columns];
      table._dataSource._data] = _data];
      }
    }
    designer.refresh();
});
提示:代码中使用了内置对象,请在使用前酌情慎重考虑这可能会带来的风险,如果你不确定自己在做什么,请勿使用此代码。

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

这段代码只是一个简单的演示,如果有其他的需求,请大家自行根据接口文档实现。
页: [1]
查看完整版本: 当ReportSheet的数据源变化后如何刷新数据源