代码之家  ›  专栏  ›  技术社区  ›  Fari.Fairis

如何从TreeStore Extjs4.1中获取数据

  •  2
  • Fari.Fairis  · 技术社区  · 11 年前

    分机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 回复  |  直到 11 年前
        1
  •  9
  •   Reimius    11 年前

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

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

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

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

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

    由于正则存储和树存储的底层结构完全不同,它们的功能也完全不同。我猜在上面的例子中,存储和节点函数的正确使用应该是:

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

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

        2
  •  0
  •   Eugene Kuzmenko    11 年前

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

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