找回密码
 立即注册

QQ登录

只需一步,快速开始

insit

注册会员

3

主题

9

帖子

36

积分

注册会员

积分
36
  • 124

    金币

  • 3

    主题

  • 9

    帖子

最新发帖
insit
注册会员   /  发表于:2022-9-9 11:01  /   查看:1766  /  回复:11
创建下拉单元格,因为下拉选项是调用接口获取的,为更好的用户体验,表格首次创建时 下拉选项设为空‘const verticalStyle = new GC.Spread.Sheets.Style();
    verticalStyle.cellButtons = [
        {
            imageType: GC.Spread.Sheets.ButtonImageType.dropdown,
            command: 'openList',
            useButtonStyle: false,
            enabled: true
        }
    ];
    verticalStyle.dropDowns = [
        {
            type: GC.Spread.Sheets.DropDownType.list,
            option: {
                multiSelect: false,
                items: []
            }
        }
    ];
    sheet.setStyle(rowIdx, colIdx, verticalStyle);



点击倒三角按钮时,监听buttonClicked事件,调用后台接口,获取下拉选项列表,再次执行上述方法,设置options
setTimeout(() => {
        const options = [
            { text: 'a', value: 0 },
            { text: 'b', value: 1 }
        ];
        const verticalStyle = new GC.Spread.Sheets.Style();
        verticalStyle.cellButtons = [
            {
                imageType: GC.Spread.Sheets.ButtonImageType.dropdown,
                command: 'openList',
                useButtonStyle: false,
                enabled: true
            }
        ];
        verticalStyle.dropDowns = [
            {
                type: GC.Spread.Sheets.DropDownType.list,
                option: {
                    multiSelect: false,
                    items: options
                }
            }
        ];
        sheet.setStyle(rowIdx, colIdx, verticalStyle);
    }, 5000);



然后我再次点击倒三角按钮,下拉列表不显示。然后我随意点击其他单元格,然后再点击倒三角按钮,下拉选项才会展示。
感觉是有个开关
有什么办法可以解决吗?





11 个回复

倒序浏览
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2022-9-9 15:26:49
沙发
本帖最后由 Ellia.Duan 于 2022-9-9 16:35 编辑

您好,从后端获取到的数据必须是在buttonClick事件触发后重新赋值吗?。如果您的项目是使用的Vue或者React框架,可以在初始化Spread之后,获取到Spread实例后,获取后端数据,对下拉框内容赋值。
回复 使用道具 举报
insit
注册会员   /  发表于:2022-9-13 10:56:51
板凳
Ellia.Duan 发表于 2022-9-9 15:26
您好,从后端获取到的数据必须是在buttonClick事件触发后重新赋值吗?。如果您的项目是使用的Vue或者React ...

是的,必须是在buttonClick事件触发后重新赋值。因为下拉数据后端会进行实时更新,点击按钮是需要获取到最新的数据。
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2022-9-13 13:53:20
地板
您好,问题已复现,已将此问题记录下来进一步调研,待有进展会在贴中通知您。本贴先做保留处理(SJS-14683)
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2022-9-14 14:24:57
5#
本帖最后由 Ellia.Duan 于 2022-9-23 16:50 编辑

您好,通过调研,通过style设置dropdown暂时无法实现下拉框懒加载,您可以尝试下面的代码,使用ComBox定义下拉框,然后在EditStarting事件中,获取后端数据,再填充下拉框内容
  1. var sheet = spread.getActiveSheet();
  2.         const combo = new spreadNS.CellTypes.ComboBox();
  3.         combo
  4.             .editorValueType(spreadNS.CellTypes.EditorValueType.text);
  5.         sheet.setValue(0, 3, "Result:");
  6.         sheet.getCell(1, 2, spreadNS.SheetArea.viewport).cellType(combo);


  7.         sheet.bind(GC.Spread.Sheets.Events.EditStarting, function (sender, args) {
  8.             //可以再次获取后端返回数据
  9.             const {row, col} = args;
  10.             if (row == 1 && col == 2) {
  11.                 combo.items([
  12.                     {text: '1', value: '11k'},
  13.                     {text: '2', value: '15k'},
  14.                     {text: '3', value: '100k'}]);
  15.             }
  16.         });
复制代码
实现效果如下:
image.png244599303.png
回复 使用道具 举报
insit
注册会员   /  发表于:2022-9-27 15:38:46
6#
Ellia.Duan 发表于 2022-9-14 14:24
您好,通过调研,通过style设置dropdown暂时无法实现下拉框懒加载,您可以尝试下面的代码,使用ComBox定义 ...

editStarting事件中加载后端数据,然后填充下拉框,也是必须先失焦之后再点击,下拉框才有数据。您给的例子是用的同步加载的数据没问题,但是接口数据是异步的
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2022-9-27 15:51:44
7#
这边使用ajax调用接口数据,
image.png606997069.png
点击下拉框是可以出现值的
回复 使用道具 举报
Lynn.Dou讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-10-25 10:49:40
8#
请问楼主的问题解决了就好,如果仍有疑问可以追帖交流。
回复 使用道具 举报
insit
注册会员   /  发表于:2022-10-28 16:02:40
9#
Ellia.Duan 发表于 2022-9-27 15:51
这边使用ajax调用接口数据,

点击下拉框是可以出现值的

async 设为true。或者不用ajax,使用setTimeout定时器,3s之后,设置combo.items([{value:1,text:1}]);这样的话,3s之后下拉框不能出现值,必须当前单元格失去焦点后,在点击下拉框才会出现值。版主试试
回复 使用道具 举报
Ellia.DuanSpreadJS 开发认证
超级版主   /  发表于:2022-10-28 16:41:45
10#
本帖最后由 Ellia.Duan 于 2022-10-28 16:45 编辑
insit 发表于 2022-10-28 16:02
async 设为true。或者不用ajax,使用setTimeout定时器,3s之后,设置combo.items([{value:1,text:1}]); ...

这里有一篇文章,介绍了$.ajax中async用法,默认async为true 即异步操作。这里设置async为false ,即等待success方法中的代码执行完成后,跳出$.ajax执行其他代码。
https://blog.csdn.net/itmyhome1990/article/details/48765661
setTimeout 也是异步执行方法,异步执行setTimeoute之后的代码,setTimeoute之后没有代码后,此事件就结束了,然后combox失去焦点,所以就表现下拉框里面的值是空的,没有设置上,下次重新点击展开下拉框内容才出现,是因为setTimeoute执行结束,为其赋值了。
设置async后影响您取后端的数据吗?
除此之外,没有更好的方案来实现您的需求了

回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部