如何从 TreeStore Extjs4.1 获取数据

Posted

技术标签:

【中文标题】如何从 TreeStore Extjs4.1 获取数据【英文标题】:How to get data from TreeStore Extjs4.1 【发布时间】: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'中,这个方法是行不通的!

有什么建议吗?

【问题讨论】:

【参考方案1】:

这是对 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)函数从节点获取你想要的属性。

【讨论】:

【参考方案2】:

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

考虑这样一种情况,当您有一个带有检查列的树形网格时,您正在侦听该列的“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));
  

【讨论】:

在 ExtJS 4.2.x 中,通过 checkchange 事件传递的节点索引不计算折叠节点的子节点。所以使用上面的代码我会得到错误的模型记录。我只是在 "current++;" 之后添加了 "if (nodes[i].isExpanded()) " ...它似乎工作正常。虽然它似乎有效,但我可能不会坚持使用这段代码,因为它看起来有点脆弱。

以上是关于如何从 TreeStore Extjs4.1 获取数据的主要内容,如果未能解决你的问题,请参考以下文章

extjs 4.1 treestore 延迟加载:q 是,它分支吗?

如何在 extjs 4 (mvc) 中过滤静态 treeStore

Extjs4.1 Grid-如何在 itemdblclick 函数中获取 cellIndex

如何从 extjs4.1 中的应用程序控制器调用视图

Extjs 4.1 - 如何在存储中嵌入从服务器发送的数据

GTK+ 3.0:如何将 Gtk.TreeStore 与自定义模型项一起使用?