我正在使用Ext.data.Store来调用PHP脚本,该脚本返回一个JSON响应,其中包含有关将在查询中使用的字段的元数据(唯一名称,表,字段和用户友好标题)。然后我遍历每个Ext.data.Record对象,将我需要的数据放入一个数组(this_column
),将该数组推送到另一个数组的末尾(columns
),最后通过这是一个Ext.grid.ColumnModel对象。
我遇到的问题是 - 无论我正在测试哪个查询(我有多个查询,大小和复杂程度各不相同),列数组始终按预期工作到columns[15]
。在columns[16]
,此点和之前的所有索引都填充了columns[15]
的值。当整个数组包含相同的值时,此行为将持续到循环到达Ext.data.Store对象的末尾。
以下是一些代码:
columns = [];
this_column = [];
var MetaData = Ext.data.Record.create([
{name: 'id'},
{name: 'table'},
{name: 'field'},
{name: 'title'}
]);
// Query the server for metadata for the query we're about to run
metaDataStore = new Ext.data.Store({
autoLoad: true,
reader: new Ext.data.JsonReader({
totalProperty: 'results',
root: 'fields',
id: 'id'
}, MetaData),
proxy: new Ext.data.HttpProxy({
url: 'index.php/' + type + '/' + slug
}),
listeners: {
'load': function () {
metaDataStore.each(function(r) {
this_column['id'] = r.data['id'];
this_column['header'] = r.data['title'];
this_column['sortable'] = true;
this_column['dataIndex'] = r.data['table'] + '.' + r.data['field'];
// This display valid information, through the entire process
console.info(this_column['id'] + ' : ' + this_column['header'] + ' : ' + this_column['sortable'] + ' : ' + this_column['dataIndex']);
columns.push(this_column);
});
// This goes nuts at columns[15]
console.info(columns);
gridColModel = new Ext.grid.ColumnModel({
columns: columns
});
答案 0 :(得分:0)
好的,既然this_column数组在每次运行时都正确响应,但是没有列数组,我认为它必须是push()的问题。
经过多次玩弄之后,我移动了修改代码以在循环的每次迭代中重置this_column数组 - 似乎修复了问题......
metaDataStore.each(function(r) {
this_column = [];
this_column['id'] = r.data['id'];
this_column['header'] = r.data['title'];
this_column['sortable'] = true;
this_column['dataIndex'] = r.data['table'] + '.' + r.data['field'];
columns.push(this_column);
});
答案 1 :(得分:0)
我看到你已经发现了一些有用的东西,但只是为未来提供一些建议:如果直接使用json存储和列模型而不是手动执行中间步骤,这会更容易。
我不确定你是使用网格还是数据视图,但这两个概念几乎相同。如果你不得不做一些数据自定义,但不是在这里手工完成,你实际上可以在prepareData回调函数中进行。
答案 2 :(得分:0)
因为您首先在全局上下文中使用变量this_column
(在示例的顶部),它将变为全局变量。您应该将每个列定义实例化为对象文字(分成多行以获得可读性)。
metaDataStore.each(function(r) {
columns.push({
id: r.data['id'],
header: r.data['title'],
sortable: true,
dataIndex: r.data['table'] + '.' + r.data['field']
});
});
或者如果您真的想使用变量,您可以这样做以确保它是局部变量
metaDataStore.each(function(r) {
var this_column = {};
...