如何从TreeStore Extjs4.1获取数据

时间:2013-04-15 10:47:18

标签: tree extjs4.1

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'中,这种方法不起作用!

有什么建议吗?

2 个答案:

答案 0 :(得分:8)

这是与Extjs的常见误解。 Ext.data.TreeStore和Ext.data.Store实际上不是很相似,也不会从另一个继承。

商店以模型数组的格式保存数据:

[
    {
        attribute1,
        attribute2,
        ...
    },
    ...
]

而treestore以节点树结构的格式保存数据,如下所示:

{
    attribute1,
    attribute2,
    ...,
    children: [
        {
            attribute1,
            attribute2,
            ...,
            children: [
                ...
            ]
        }
    ]
}

由于常规存储和树库底层的这些完全不同的结构,它们上的功能完全不同。我猜你在上面的例子中,正确使用存储和节点函数将是:

var data1 = treestore.getRootNode().getChildAt(0).get(fieldname);

getRootNode()获取树的根节点,该节点由类NodeInterface表示,该类具有检索根节点的第一个子节点的方法getChildAt(index)。然后我使用get(dataIndex)函数从节点获取所需的属性。

答案 1 :(得分:-1)

这实际上是一项非常需要的功能。

考虑一下当你有一个带有检查列的树网格的情况时,你正在收听该列的“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));
  }
}