我的页面现在加载速度超慢。基本上,我想预先填充我拥有的组合框。现在,它单独预先填充每个,然后选择默认值。这太慢了。在页面完全加载之前,用户必须等待大约一分钟。
我正在抓取值以从服务器填充组合框。预先选择组合框值的值通过响应变量在数组中接收。我如何加速整个过程?
代码如下:
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 () {
},
};
}();
//makes call to server for each individual combo box values
//grabs all pre-selected values based on an ID and puts them in an array
答案 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(或者可能不存储它,但是,但是无论如何都要将它发送到客户端)。但是,这不是那么好,并且在删除完整列表请求后加载时间可能足够快。如果不是,请尝试查看是否可以在一个请求中请求所有单值显示。