本帖最后由 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[key].dataName) {
- map[schemaColumns[key].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[key]) {
- ifSet = true;
- }
- delete table.options.schema.columns[key];
- delete table.columns[key];
- delete table._dataSource._data[key];
- if (ifSet) {
- table.options.schema.columns[map[key]] = schemaColumns[map[key]];
- table.columns[map[key]] = columns[map[key]];
- table._dataSource._data[map[key]] = _data[map[key]];
- }
- }
- designer.refresh();
- });
复制代码
提示:代码中使用了内置对象,请在使用前酌情慎重考虑这可能会带来的风险,如果你不确定自己在做什么,请勿使用此代码。
以上代码针对“表1”进行了“字段刷新”的操作,先是针对存在dataName的字段设置了缓存,然后清空字段数据并重新获取,再根据之前的缓存重新设置字段信息,以实现刷新的效果。
这段代码只是一个简单的演示,如果有其他的需求,请大家自行根据接口文档实现。
|
|