【发布时间】:2013-04-15 10:47:17
【问题描述】:
Ext JS 4.1
要从'Ext.data.Store'中获取值数据,只需使用
var data1 = store.data.items[0].data.fieldname;
或
var data1 = store.getAt(0).data.fieldname;
但是,在'Ext.data.TreeStore'中,这个方法是行不通的!
有什么建议吗?
【问题讨论】:
Ext JS 4.1
要从'Ext.data.Store'中获取值数据,只需使用
var data1 = store.data.items[0].data.fieldname;
或
var data1 = store.getAt(0).data.fieldname;
但是,在'Ext.data.TreeStore'中,这个方法是行不通的!
有什么建议吗?
【问题讨论】:
这是对 Extjs 的常见误解。 Ext.data.TreeStore 和 Ext.data.Store 实际上不是很相似,也没有继承自另一个。
商店以模型数组的格式保存数据:
[
{
attribute1,
attribute2,
...
},
...
]
而树存储以节点树结构的格式保存数据,如下所示:
{
attribute1,
attribute2,
...,
children: [
{
attribute1,
attribute2,
...,
children: [
...
]
}
]
}
由于常规存储和树存储底层的这些完全不同的结构,它们上的功能是完全不同的。我猜在你上面的例子中,正确使用 store 和 node 函数是:
var data1 = treestore.getRootNode().getChildAt(0).get(fieldname);
getRootNode() 获取树的根节点,该根节点由 NodeInterface 类表示,该类具有 getChildAt(index) 方法,该方法检索根节点的第一个子节点。然后我使用get(dataIndex)函数从节点获取你想要的属性。
【讨论】:
这实际上是一个非常需要的功能。
考虑这样一种情况,当您有一个带有检查列的树形网格时,您正在侦听该列的“checkchange”事件并想要查找刚刚更改的记录。
不幸的是,ExtJS 为您提供的只是一个记录索引。 不过幸运的是,没有人阻止我们在自己的商店中定义自己的 getAt 方法,这正是我们想要的:
{
store: 'tree',
getAt: function (index) {
var current = 0;
return (function find(nodes) {
var i, len = nodes.length;
for (i = 0; i < len; i++) {
if (current === index) {
return nodes[i];
}
current++;
var found = find(nodes[i].childNodes);
if (found) {
return found;
}
}
}(this.tree.root.childNodes));
}
}
【讨论】: