找回密码
 立即注册

QQ登录

只需一步,快速开始

gnip

初级会员

40

主题

87

帖子

287

积分

初级会员

积分
287
gnip
初级会员   /  发表于:2024-6-26 15:19  /   查看:161  /  回复:14
100金币
用自定义ui方式替换原有的属性面板,然后通过api设置模版属性和获取模版属性,但是有一个问题,getTemplateCell方法获取到的属性不全

image.png616332702.png 比如这个单元格,只返回了这两属性,还是我通过setTemplateCell设置的,不设置压根没有,这就存在一个问题,每次要是要更新模版单元格,岂不是要把所有属性都全部设置一遍嘛?不然我回显的时候,通过getemplateCell方法拿到的属性配置根本不全,想问一下这个怎么处理好点,全部设置会有性能问题,比如用户选择一个区域,全量去设置会卡顿页面一段时间。

14 个回复

正序浏览
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:6 天前
15#
那本贴就先结贴啦,有问题欢迎发新帖交流。
回复 使用道具 举报
gnip
初级会员   /  发表于:6 天前
14#
eat_grape_5 发表于 2024-6-27 09:30
找到一个可行的方法,即控制绘制次数。当表单发生变化时SpreadJS自动刷新,在这样的机制下,当您批量设置 ...

这个方法好,确实不卡了,赞
回复 使用道具 举报
eat_grape_5
初级会员   /  发表于:6 天前
13#
gnip 发表于 2024-6-26 18:50
所以我问的是有没有方法获取当前单元格所有配置属性的值

获取当前单元格所有已配置属性值的方法是getTemplateCell方法,它返回的结果中包含了所有已经设置的属性,如果希望返回结果中包含未设置属性,那可以基于getTemplateCell方法自定义实现。提供一个思路:
1. 查看官方文档了解报表单元格可支持的属性,整理这个列表,可命名为报表单元格属性列表;
2. 通过getTemplateCell方法获取指定单元格的已设置属性值;
3. 对比getTemplateCell方法的返回结果A中的属性和报表单元格属性列表,从中过滤出未设置的属性,并对未设置属性以默认值形式添加至返回结果A中,作为自定义方法返回值。
回复 使用道具 举报
eat_grape_5
初级会员   /  发表于:6 天前
12#
本帖最后由 eat_grape_5 于 2024-6-27 10:07 编辑
gnip 发表于 2024-6-26 18:54
而且这样如果每次更新带上所有属性,用户如果框选一个区域,批量设置,页面会卡住,根据选中单元格的数量决 ...

找到一个可行的方法,即控制绘制次数。当表单发生变化时SpreadJS自动刷新,在这样的机制下,当您批量设置报表单元格时,每设置一个都将刷新一次,可在设置前后合理利用挂起绘制与恢复绘制,能够节省一定时间,示例如下:
  1. //  报表模板,spread为当前工作簿
  2. var templateSheet = spread.getSheetTab(0).getTemplateSheet();
  3. function setCellAdvanced(rowStart, colStart, rowCount, colCount) {
  4.     spread.suspendPaint();
  5.     spread.suspendEvent();
  6.     for (var i = rowStart; i < rowCount; i++) {
  7.         for (var j = colStart; j < colCount; j++) {
  8.             templateSheet.setTemplateCell(i, j, {
  9.                 type: 'List',
  10.                 binding: `Orders[orderId]`,
  11.                 autoExpand: 'Vertical',
  12.                 spillMode: 'Overwrite',
  13.                 spillDirection: 'Vertical',
  14.             });
  15.         }
  16.     }
  17.     spread.resumeEvent();
  18.     spread.resumePaint();
  19. }
复制代码


关于挂起绘制与恢复绘制对性能的优化可详细参考官方demo:https://demo.grapecity.com.cn/spreadjs/help/docs/BestPractices/UsingsuspendPaintandresumePaint
回复 使用道具 举报
gnip
初级会员   /  发表于:7 天前
11#
而且这样如果每次更新带上所有属性,用户如果框选一个区域,批量设置,页面会卡住,根据选中单元格的数量决定卡住的时长,这是不行的
回复 使用道具 举报
gnip
初级会员   /  发表于:7 天前
10#
所以我问的是有没有方法获取当前单元格所有配置属性的值
回复 使用道具 举报
eat_grape_5
初级会员   /  发表于:7 天前
9#

前后两次设置,虽然作用于同一个单元格,但setTemplateCell的第三个参数有变化。从面向对象的编程角度而言,这两个参数本质上是两个完全不同的对象,当然是后一个对象把前一个对象覆盖了。一般而言,设置之前要获取原来的属性对象,在这个属性对象中追加新的属性,再用变化后的属性对象调用setTemplateCell方法将属性设置回单元格。以楼主提供的图片中的代码为例,第二次设置的代码应该是:
  1. templateSheet.setTemplateCell(i, j, {
  2.     type: 'List',
  3.     binding: 'Bid[age]',
  4.     spillMode: 'Overwrite'
  5. });
复制代码
回复 使用道具 举报
gnip
初级会员   /  发表于:7 天前
8#
image.png640049438.png
回复 使用道具 举报
eat_grape_5
初级会员   /  发表于:7 天前
7#
gnip 发表于 2024-6-26 18:24
楼上大哥都理解错我的意思,我的意思是通过getTemplateCell获取的属性不全,api调用的方式我需要所有的属 ...

getTemplateCell接口的返回值中不包含那些未设置的属性,因为这些属性未被设置过,没有值与其匹配。
回复 使用道具 举报
eat_grape_5
初级会员   /  发表于:7 天前
6#
gnip 发表于 2024-6-26 18:21
大哥,你没看懂我的需求,不是你理解的这样

那请楼主指正下理解不到位的地方,谢谢!
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部