组合框加载速度太慢

时间:2012-06-22 16:11:14

标签: php extjs combobox extjs4

我的页面现在加载速度超慢。基本上,我想预先填充我拥有的组合框。现在,它单独预先填充每个,然后选择默认值。这太慢了。在页面完全加载之前,用户必须等待大约一分钟。

我正在抓取值以从服务器填充组合框。预先选择组合框值的值通过响应变量在数组中接收。我如何加速整个过程?

代码如下:

EXTJS

                    xtype: "combo",
                    width: 250,
                    id: "nameId",
                    name: "comboName",
                    labelStyle: 'width:100px',
                    fieldLabel:"Name",
                    allowBlank: true,
                    displayField: "nameDisplay",
                    valueField: "nameValue",
                    url: "/thelink/toGetAllComboboxValues/fromPHPFile/",



return {
    init: function (args) {

        formPanel.on({

            beforerender: function () {

                Ext.Ajax.request({
                    url: 'url/to/another/PHP/file/',
                    scope: this,
                    method: 'GET',
                    params: {
                        code_id: 'myUser',
                        number: '12345'
                    },

                    success: function (response, opts) {
                        var result = Ext.decode(response.responseText);
              Ext.getCmp('nameId').setValue(result.Name);

                    },

                });


            },

            scope: this
        });

      //add form panel here
    },

    getFormPanel: function () {

        return formPanel;
    },



    // load parameter values into the form
    loadParams: function () {

    },
    goHome: function () {

    },


};
}();

PHP获取COMBO BOX VALUES

//makes call to server for each individual combo box values

PHP获取预先选择的值

//grabs all pre-selected values based on an ID and puts them in an array

2 个答案:

答案 0 :(得分:4)

如果您的商店每个商店的记录少于约300条,并且您的页面上没有真正“那么多”商店,那么您应该做的是立即从php返回所有商品(或者更优选的是加载所有商店页面加载本身,但听起来你不能这样做)。因此,不是你的一个ajax调用获取组合框中所选项的值,而是更像这样:

为每个商店定义模型:

Ext.define("MyModel1", {
    extend: "Ext.data.Model",
    fields: [
        {name:"field_code", type:"string"},
        {name:"field_value",      type:"string"}
    ]
});

然后以非常简单的方式定义每个商店,注意我遗漏了您当前可能包含的阅读器和代理,为了提高性能,请使用Ext.data.ArrayStore,因为它消除了每个项目的必要性具有命名属性的记录(这会减少从服务器返回的文本以及前端的解析时间):

var myStore = Ext.create("Ext.data.ArrayStore", {
    model: "MyModel1",
    data:  []
});

现在在你已定义的ajax请求中,将来自php的响应添加到商店的所有数据作为返回的json对象中的属性,并将它们作为数组数组执行,确保元素顺序与您定义Ext的方式相匹配.data.Model。我的示例的返回对象看起来像这样(数据是数组数组):

{
    my_combobox_value1: "CAD",
    my_combobox_data1: [
        ["CAD","Somthing for display of this record"],
        ["AN","Another Entry]
    ]
}

然后将ajax请求更改为如下所示:

Ext.Ajax.request({
    url: 'url/to/another/PHP/file/',
    scope: this,
    method: 'GET',
    params: {
        code_id: 'myUser',
        number: '12345'
    },

    success: function (response, opts) {
         var result = Ext.decode(response.responseText);
         myStore.loadData(result.my_combobox_data1);
         Ext.getCmp('nameId').setValue(result.my_combobox_value1);
         ... and rinse and repeat for all stores, make sure you set the value for each combobox after the store has been loaded :)
    },

});

这将为您提供最佳性能。如果这不起作用,则必须使用具有处理服务器端所有内容的代理的存储,并根据需要加载数据。

答案 1 :(得分:0)

首先,我建议不要检索每个组合的完整值列表,直到用户需要它(更改值或单击触发器)。您可以通过为您的组合提供一个使用代理设置到您的URL的商店来实现此目的。

为了节省初始单值显示,一个选项是存储字符串值以及记录中的id(或者可能不存储它,但是,但是无论如何都要将它发送到客户端)。但是,这不是那么好,并且在删除完整列表请求后加载时间可能足够快。如果不是,请尝试查看是否可以在一个请求中请求所有单值显示。