ExtJs:从 Json 响应中填充 ComboBox

Posted

技术标签:

【中文标题】ExtJs:从 Json 响应中填充 ComboBox【英文标题】:ExtJs : Populate ComboBox from Json Response 【发布时间】:2019-03-06 06:01:37 【问题描述】:

我正在使用 Extjs 5.1 使用从 AJAX 调用返回的数据填充组合框。

AJAX 调用返回产品名称,但组合框以逗号分隔的单行填充数据(要求是在单独的行中填充项目,每行一个项目)。

组合框逻辑


    xtype: 'combo',
    queryMode: 'remote',
    itemId: 'prodListCombo',
    name: 'prodNumber',
    emptyText: '-- Select Product --',
    width: '290px',
    height: '32px',
    autoSelect: false,
    enableKeyEvents: true,
    selectOnFocus: false,
    minChars: 1,
    padding: '0 0 0 5',

    listConfig: 
        maxHeight: 110,
        emptyText: 'No Products found.'
    ,
    triggerAction: 'all',
    displayField: 'prodNumber',
    store: productStore,
    editable: false,
    typeAhead: false,
    forceSelection: true,
    dataIndex: 'prodNumber',
    lastQuery: '',
    listeners: 
        click: function(grid, rowIndex, colIndex) 

        ,
        beforequery: function(queryPlan, eOpts) 
            var prodInstore = "";
            var prodInstoreArrray = [];
            //MMACMF-74
            Prod_Num = Ext.ComponentQuery.query('#prodListCombo')[0];

            Ext.Ajax.request(
                url: MaintenanceAdvisor.util.AppUrls.appurls.getCustomerProds,
                method: 'GET',
                params: 
                    "customerName": 'CUST A'
                ,
                success: function(response) 
                    debugger;
                    var response2 = Ext.decode(response.responseText);
                    var datafiles = response2.data; ** -- > datafiles has the data of PROD A and PROD B. **


                        if (datafiles.length === 0) 

                         else 
                            store.removeAll();
                            store.add(datafiles);
                            Ext.ComponentQuery.query("#prodListCombo")[0].setValue(store.getData('prodNumber').items);

                            for (var iProd = 0; iProd < datafiles.length; iProd++) 
                                var ProdId = store.getAt(iProd).data.prodNumber;

                                prodInstore += ProdId;
                                prodInstore += ',';

                            
                            prodInstore = prodInstore.substr(0, prodInstore.length - 1);
                            prodInstoreArrray = prodInstore.split(",");

                            //Ext.ComponentQuery.query("#prodListCombo")[0].setValue(prodInstoreArrray);

                        
                ,
                failure: function(response) 
                    alert("failed");
                
            );

         //beforequery
     //listeners
,

JSON 响应

datafiles: Array(2)
0:
    id: "CustomerCenter-31"
    customerName: null
    customerType: "OPERATOR"
    **productNumber: "PROD A"**
    __proto__: Object
1:
    id: "CustomerCenter-32"
    customerName: null
    customerType: "OPERATOR"
    **productNumber: "PROD B"**
    __proto__: Object
length: 2

Java 代码为 AJAX 调用请求返回 Map。

但是组合框中的数据是用逗号分隔的。

请指导我对脚本进行任何更改以将其填充到每一行中。

谢谢 撞锤

【问题讨论】:

【参考方案1】:

您的代码有点混乱,但我看到您使用了一些不必要的方法,例如beforequery 事件、挂载数组的循环等等。我会建议另一种方法,更符合框架的特性。

由于您的组合框是editable: false,因此使用select 事件而不是beforequery 来调用第二个组合框填充。要填充它,而不是直接使用Ext.Ajax.request,配置商店的proxy.api 并在设置第一个组合框中选择的参数后使用Ext.data.Store.html method load 事件可能更有趣。商店必须有一个关联的modelfields 属性,填充的属性与返回的 JSON 相同。

我用Jakeplaceholder Fake Online REST API 设置了一个例子:

Ext.application(
    name : 'Fiddle',

    launch : function() 

        var firstStore = Ext.create('Ext.data.Store', 
            proxy: 
                type: 'ajax',
                api: 
                    read: 'https://jsonplaceholder.typicode.com/albums'
                
            ,
            fields: [
                 name: 'id' ,
                  name: 'title' 
            ]
        );

        var secondStore = Ext.create('Ext.data.Store', 
            proxy: 
                type: 'ajax',
                api: 
                    read: 'https://jsonplaceholder.typicode.com/photos'
                
            ,
            fields: [
                 name: 'id'  ,
                 name: 'title' 
            ]
        );

        Ext.create('Ext.window.Window', 
            title: 'Test Ajax Combobox',
            layout: 'form',
            maximized: true,
            items: [
                
                    xtype: 'combobox',
                    label: 'First Combo',
                    editable: false,
                    valueField: 'id',
                    displayField: 'title',
                    store: firstStore,
                    listeners: 
                        select: function(field, record, e)
                            field.next().reset();

                            alert('Selected a new item on first combobox store.');
                            field.up('window').mask('Wait...');
                            secondStore.load(
                                params: 
                                    albumId: record.get('id')
                                ,
                                callback: function()
                                    field.up('window').unmask();
                                    alert('Arrived the response of the request and automatically filled the second combobox store.');
                                
                            );

                            // Or...
                            // secondStore.getProxy().setExtraParam('albumId',  record.get('id'));
                            // secondStore.reload(
                            //     callback: function()
                            //         field.up('window').unmask();
                            //         alert('Arrived the response of the request and automatically filled the second combobox store.');
                            //     
                            // );
                        
                    
                ,
                
                    xtype: 'combobox',
                    editable: false,
                    label: 'Second Combo',
                    store: secondStore,
                    valueField: 'id',
                    displayField: 'title'
                
            ]
        ).show();

    
);

查看链接上的文档。

有任何问题,请发表评论。 希望对你有帮助。

【讨论】:

我喜欢这种方法,但我不能在我的项目中使用这种方法。谢谢你:)

以上是关于ExtJs:从 Json 响应中填充 ComboBox的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSON 填充 ComboBox ExtJS 4.2

ExtJS json 存储未填充

在 ExtJS4 TreeGrid 中加载嵌套的 JSON 数据

如何检查从服务器收到的响应是 html 还是 json 并在 extjs 中按名称查找 html 表单?

如何在 Extjs 4 中使用嵌套的 JSON 填充表单

带有 JSON 读取的 EXTJS 4 表单填充