【问题标题】:dynamically load json data in combo box using Extjs3使用 Extjs3 在组合框中动态加载 json 数据
【发布时间】:2019-07-05 15:55:06
【问题描述】:

对此的任何部分的帮助表示赞赏。我对使用 extjs 完全陌生,而且版本很旧(3.3)。当用户选择组合框时,数据被加载到组合框中。我需要允许用户选择/插入一个空白选项(即:所以第一个选项应该是 id:0 字段并且可以是空白的)。最后,我必须给模型一个额外的字段:id

我可以在网络选项卡中看到返回的数据,所以我的 url 路径正确(该 url 设置为返回 idlist name),但 store 属性为空,所以没有数据在组合框中。

header: 'Bucket List',
sortable: true,
dataIndex: 'bucket_list',
width: 10,
align: 'center',
editor: BucketList = new Ext.form.ComboBox({
        valueField: 'name',
        displayField: 'name',
        triggerAction: 'all',
        typeAhead: true,
        preventMark: true,
        editable: false,
        store: new Ext.data.Store({
               proxy: new Ext.data.HttpProxy({
                      url: '/todos/sysadmin/bucket-lists',
                      method: 'GET'
               }),
               reader: new Ext.data.JsonReader({
                       root: 'bucket_lists',
                       fields: [
                           'id',
                           'name'
                        ]
               }),
               listeners: {
                       beforeload: function (data_objStore, data_objOpt) {
                             data_objOpt.params.userModel = userModelCbx.getValue();                                          
                             data_objOpt.params.user_id = 001;
                       }
                 }
       }),
       listeners: {
           blur: function () { }
       }
}),

下面的代码显示了响应,但在索引 0 处,id 为 1。我需要索引 0 为 id: 0 或空值(0: {id: 0, name: ''}

回应:

0: {
id: 1, 
name: "bucketListItem_1"
}
1: {
id: 2, 
name: "bucketListItem_2"
}
2: {
id: 3, 
name: "bucketListItem_3"
}
3: {
id: 4, 
name: "bucketListItem_4"
}

我已经阅读了很多关于 SO 的文档和答案。我尝试使用一些存储方法,例如add(), insert(), load(),但我可能在错误的地方或其他地方使用它们。我在这里问是因为我被困住了,我真的希望有人能帮助我。谢谢。


更新beforeload 之后,将此添加到store 侦听器以插入空白记录。确保您的读者正在访问正确的字段

beforeload: function( sObj, optObjs ){
     // code here...
},    
load: function(store, records) {                                           
        store.insert(0, [new Ext.data.Record({
              id: null,
              name: 'None'
              })
        ]);
    }

回应

0: {
id: null, 
name: "None"
}
1: {
id: 1, 
name: "bucketListItem_1"
}
2: {
id: 2, 
name: "bucketListItem_2"
}
...

【问题讨论】:

    标签: javascript extjs data-binding extjs3


    【解决方案1】:

    您可以尝试下一个工作示例。您需要使用new Ext.data.Record 在商店的load 侦听器上插入记录。还要检查tpl 配置选项 - 需要正确显示空记录。示例使用 ExtJS 3.4 进行了测试,但我认为它也应该适用于您的版本。

    Ext.onReady(function() {
        var combo = new Ext.form.ComboBox({
            tpl : '<tpl for="."><div class="x-combo-list-item">{name}&nbsp;</div></tpl>',
            valueField: 'name',
            displayField: 'name',
            triggerAction: 'all',
            typeAhead: true,
            preventMark: true,
            editable: false,
            store: new Ext.data.Store({
                proxy: new Ext.data.HttpProxy({
                    url: '/todos/sysadmin/bucket-lists',
                    method: 'GET'
                }),
                reader: new Ext.data.JsonReader({
                    root: 'bucket_lists',
                    fields: [
                        'id',
                        'name'
                    ]
                }),
                listeners: {
                    load: function (s) {
                        record = new Ext.data.Record({
                            id: 0,
                            name: ''
                        });
                        s.insert(0, record);
                    }
                }
            })
        });
    
        var grid = new Ext.grid.EditorGridPanel({
            renderTo: Ext.getBody(),
            store: new Ext.data.Store({
                autoLoad: true,
                proxy: new Ext.data.HttpProxy({
                    url: 'combo-extjs3-editor-json.html',
                    method: 'GET'
                }),
                reader: new Ext.data.JsonReader({
                    root: 'bucket_lists',
                    fields: [
                        'id',
                        'name'
                    ]
                })
            }),
            width: 600,
            height: 300,
            columns: [
                {
                header: 'Name',
                dataIndex: 'name',
                width: 130,
                editor: combo
                }
            ]
        }); 
    });
    

    【讨论】:

    • 感谢您的回答。对于这个组合框,它没有使用tpl,代码如上。组合框位于Ext.grid.EditorGridPanel (这有帮助吗?),所以我没有在您的代码中添加tpl。我尝试使用您的load 呼叫,但我想由于此组合框未使用tpl,因此没有任何改变。我想首先将数据加载到组合框中,但我似乎无法做到这一点
    • @Chris22 只是为了测试,将name: '' 更改为name: '0 item' 看看是否可行。
    • 再次感谢。感谢您对我的帮助。我在load 方法中进行了更改,但没有任何更改。即使我可以加载数据,也会有很大帮助
    • 谢谢你的小提琴。我看到您的代码正在运行。我知道它会在你的用例中工作:)。如果我添加它,我的代码没有使用 tpl,当我单击组合框时,它会转换为静态字段(它不再是组合框/选择类型输入元素)。由于您的帮助,我赞成您的回答。
    • 我看到我的阅读器返回了一个字段数组(不在根目录内)。我运行 insert(),将 Ext.data.Record() 作为索引后的第二个参数传递。因此,在我编辑我的代码后,您的代码提供了一个解决方案。标记为答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多