Javascript 存储更新后未刷新ExtJS网格
我有一个网格和一个商店。存储区将填充一些数据-Javascript 存储更新后未刷新ExtJS网格,javascript,arrays,extjs,gridview,Javascript,Arrays,Extjs,Gridview,我有一个网格和一个商店。存储区将填充一些数据-国家/地区,而其余数据为空。一旦我收到更多的输入,我就用输入填充存储 假设在初始加载后,商店中只有1个国家/地区 商店: feedTheGrid = new Ext.data.JsonStore({ autoDestroy : true, autoSave : false, autoLoad : true, idProperty: 'country', root: 'root', totalProper
国家/地区
,而其余数据为空。一旦我收到更多的输入,我就用输入填充存储
假设在初始加载后,商店中只有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
中:
我希望网格在每次新市镇建成时都能更新
这是我用于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似乎总是空字符串,即使在我将新值推入数组并刷新网格视图之后也是如此
我正在使用extjs3.3.1
我知道它很老,所以我愿意接受适用于4.0+的解决方案,我可以尝试将其应用于3.3.1
编辑:找到问题
非常微妙的问题,花了几个小时试图找出问题所在,却发现我找错了地方。问题是这样的:
feedTheGrid.getAt(0).towns.push(this.getValue());
feedTheGrid.getAt(0).towns.push(this.getValue());
此行实际上创建了一个新字段towns
,作为使用getAt(0)
获得的记录的一部分。使用firebug查看是否填充了getAt(0).towns[0]
,实际上返回了您推送的值,这是误导性的
ExtJS不知道这个新字段,也不应该知道
该行应为:
feedTheGrid.getAt(0).data.towns.push(this.getValue());
{ header: "Id", width: 150, dataIndex: 'id', sortable: true},
{ header: "Country", width: 150, dataIndex: 'country', sortable: true},
{ header: "Town(s)", width: 150, dataIndex: 'towns', sortable: true}
feedTheGrid.getAt(0).data.towns.push(this.getValue());
诀窍是指向正确的位置:.data
。Javascript/ExtJS允许您在没有任何警告的情况下添加新字段,因为从技术上讲,您没有做错任何事情。从逻辑上讲,它创建了一个不做任何事情的新字段
@Lorenz Meyer我可以使用渲染器显示阵列的元素,同时指向列模型中的towns阵列。关于ExtJs中的存储和网格是什么,存在一个主要的误解 两者都只是表格数据的表示。
存储
是表在内存中的表示形式,以便快速访问记录筛选和更多功能。网格是浏览器窗口中表格的可视表示形式
这样的表可能看起来像:
Id | Country | City
-------------------
1 | US | NYC
2 | France | Macon
3 | US | Macon
首先,在一个表行上,只能有一个城市。在表中,单个字段中不能有数组。如果您有多个城市,这就是行的用途
然后,您的idProperty
不能是国家/地区。如果是,这就意味着国家是独一无二的。显然,他们不是。一个国家可以有多个城市。(城市也不能是idProperty,因为存在多个具有相同属性的城市)
现在您肯定开始明白了,feedTheGrid.getAt(0.towns.push(this.getValue())代码>毫无意义。towns
列不能是数组。您插入一个新行,其中feedTheGrid.add({country:'US',towns:'LA'})
最多,towns
列可以是逗号分隔的值,在这种情况下,您可以使用
var record = feedTheGrid.getAt(0),
currentTowns = record.get('towns');
record.set('towns', currentTowns + ', ' + value)
记录的方法set
发挥了所有的魔力:它将更新事件传递给网格,以便重新渲染它。您的推送操作
除了错误之外,不会触发更新视图所需的事件
关于网格:网格的列应为:
feedTheGrid.getAt(0).data.towns.push(this.getValue());
{ header: "Id", width: 150, dataIndex: 'id', sortable: true},
{ header: "Country", width: 150, dataIndex: 'country', sortable: true},
{ header: "Town(s)", width: 150, dataIndex: 'towns', sortable: true}
feedTheGrid.getAt(0).data.towns.push(this.getValue());
注:
- 听众:
对我来说真的很奇怪,但也许只是因为大局不见了
feedTheGrid
对商店来说是个奇怪的名字。存储区不提供数据。它是一个数据在渲染器中,
val
不能是数组。这是一个简单的变量。这就是为什么您的网格没有刷新。非常微妙的问题,花了几个小时试图找到问题所在,但却发现我找错了地方。问题是这样的:
feedTheGrid.getAt(0).towns.push(this.getValue());
feedTheGrid.getAt(0).towns.push(this.getValue());
这一行实际上创建了一个新字段towns,作为使用getAt(0
)获得的记录的一部分。使用firebug查看是否填充了getAt(0).towns[0]
,实际上返回了您推送的值,这是误导性的
ExtJS不知道这个新字段,也不应该知道
该行应为:
feedTheGrid.getAt(0).data.towns.push(this.getValue());
{ header: "Id", width: 150, dataIndex: 'id', sortable: true},
{ header: "Country", width: 150, dataIndex: 'country', sortable: true},
{ header: "Town(s)", width: 150, dataIndex: 'towns', sortable: true}
feedTheGrid.getAt(0).data.towns.push(this.getValue());
诀窍是指向正确的位置:.data
。Javascript/ExtJS允许您在没有任何警告的情况下添加新字段,因为从技术上讲,您没有做错任何事情。从逻辑上讲,它创建了一个不做任何事情的新字段
@Lorenz Meyer我可以使用渲染器显示阵列元素,同时指向列模型中的towns阵列。为什么有3列都包含一个town?网格应该有引用存储中记录字段的列。每列都是数组的元素。我认为有多个列映射到同一成员(dataIndex)可能会有问题。检查控制台是否有错误?@FrancisDucharme控制台中没有错误。选中编辑以获得解决方案感谢您的输入。作为补充说明,我设法在另一个网格中使用数组作为列的数据。它从我通过渲染器指定的数组中拾取值。我显然没有使用国家作为唯一ID,我试图使问题更一般化。存储/网格名称也是如此。很抱歉给您带来了混乱。我知道存储就是数据。我打开数组,在每个城镇的存储/网格中设置单独的字段。它仍然不会刷新网格。商店接受新值。我只是使用输入中的
this.getValue()
来做一个赋值。