【发布时间】:2015-03-24 19:08:27
【问题描述】:
我有一个网格和一个商店。商店中填充了一些数据 - country - 而其余的都是空的。一旦我收到更多输入,我就会用输入填满商店。
假设我在初次加载后商店中只有 1 个国家/地区。
商店:
feedTheGrid = new Ext.data.JsonStore({
autoDestroy : true,
autoSave : false,
autoLoad : true,
idProperty: 'country',
root: 'root',
totalProperty : 'totalcount',
fields : ['country', 'towns'],
proxy : new Ext.data.HttpProxy(new Ext.data.Connection({
url : "country/searchCountries.action",
method : 'POST',
timeout : 300000
}))
});
所以用户输入城镇。我使用push() 在数组towns 中保存了一个城镇:
listeners: {
'change': function() {
if (feedTheGrid.getAt(0).towns === undefined) {
feedTheGrid.getAt(0).towns = [];
}
feedTheGrid.getAt(0).towns.push(this.getValue());
gridMonster.getView().refresh();
}
}
我希望每次加入新城镇时网格都会更新。
这是我用于gridMonster 的列模型的一部分:
{ header: "Town 1", width: 150, dataIndex: 'towns',
renderer: function(val) {
if (val[0] != undefined) {
return val[0];
}
}, sortable: true},
{ header: "Town 2", width: 150, dataIndex: 'towns',
renderer: function(val) {
if (val[1] != undefined) {
return val[1];
}
}, sortable: true},
{ header: "Town 3", width: 150, dataIndex: 'towns',
renderer: function(val) {
if (val[2] != undefined) {
return val[2];
}
}, sortable: true}
问题是城镇加入网格后永远不会刷新。
到目前为止我注意到的一些事情:
当我检查 Firebug 时,商店会更新为新值。此外,即使在我将新值推送到数组并刷新网格视图之后,渲染器中给出的 val 似乎总是空字符串。
我正在使用 ExtJS 3.3.1
我知道它很旧,所以我对适用于 4.0+ 的解决方案持开放态度,我可以尝试将其应用于 3.3.1。
编辑:发现问题
非常微妙的问题,花了几个小时试图找出问题所在,却发现我找错了地方。问题出在这一行:
feedTheGrid.getAt(0).towns.push(this.getValue());
这一行实际上创建了一个新字段towns,作为您使用getAt(0) 获得的记录的一部分。使用 firebug 查看是否填充了 getAt(0).towns[0] 实际上会返回您推送的值,这是具有误导性的。
ExtJS 不知道这个新字段,也不应该知道。
这一行应该是:
feedTheGrid.getAt(0).data.towns.push(this.getValue());
诀窍是指向正确的位置:.data。 Javascript/ExtJS 允许您在没有任何警告的情况下添加新字段,因为从技术上讲,您没有做错任何事情。从逻辑上讲,它会创建一个什么都不做的新字段。
@Lorenz Meyer 我可以使用渲染器显示数组的元素,同时指向列模型中的城镇数组。
【问题讨论】:
-
为什么你有 3 列都包含一个城镇?网格应该有列,每个列都引用存储中记录的字段。
-
每一列都是数组的一个元素。
-
我认为有多个列映射到同一个成员(dataIndex)可能是个问题。检查控制台是否有错误?
-
@FrancisDucharme 控制台中没有错误。检查解决方案的编辑
标签: javascript arrays extjs gridview