如何填充没有子节点或叶子信息的 Ext.data.TreeStore?

Posted

技术标签:

【中文标题】如何填充没有子节点或叶子信息的 Ext.data.TreeStore?【英文标题】:How to populate an Ext.data.TreeStore without children or leaf information? 【发布时间】:2013-01-22 13:41:03 【问题描述】:

我有一个服务,它返回一个事物数组。一个事物只有一个id 和一个name

我想将这些加载到Ext.tree.Panel。目前,我已经定义了一个模拟来自服务的典型响应的数据存储。您可以使用演示 JSFiddle here

下面也包含代码:

Ext.define('Thing', 
    extend: 'Ext.data.Model',
    fields: ['id', 'name'],
);

var store = Ext.create('Ext.data.TreeStore', 
    model: 'Thing',

    // example service response (in reality, this would be JSON)
    root: 
        children: [
            
                id: 1,
                name: 'Thing 1',
            ,
            
                id: 2,
                name: 'Thing 2',
            ,
            
                id: 3,
                name: 'Thing 3',
            ,
        ],
    ,

    listeners: 
        append: function(thisNode, newChildNode, index, eOpts) 
            if( !newChildNode.isRoot() ) 
                newChildNode.set('text', newChildNode.get('name'));
            
        ,
    ,
);

Ext.create('Ext.tree.Panel', 
    renderTo: Ext.getBody(),
    store: store,
    rootVisible: false,
);

如您所见,该服务仅返回事物的idname,没有像childrenleaf 这样的树节点信息,这是Ext.data.TreeStore 通常所期望的。

我根本无法更改服务作为响应返回的内容。我喜欢我可以调用该服务并获得一个平面的事物数组,而无需额外的树节点信息。有许多与该服务通信的应用程序根本不需要这些数据,而且我没有获得权力的许可来更改它。

不幸的是,如果没有为响应中的每个事物定义 children 元素,当我尝试扩展节点时,Ext 会引发以下错误(您可以在 JSFiddle 中自己生成):

Uncaught TypeError: Cannot call method 'indexOf' of undefined 

所以,我的问题是:如何避免在回复中发回children(或leaf)并解决此错误?我只是想让我的东西被加载到树中并且可以扩展(是的,它们不能是叶子)。

【问题讨论】:

【参考方案1】:

自己添加这些信息!

小例子(您可以在浏览器的控制台中轻松尝试):

a = b:23;
a.c = 25;
//a is now the same like b:23, c:25

在 store 的 afterRequest-method 中,您可以执行以下操作:

proxy: 
    type: 'ajax',

    url: 'xxx',

    listeners: 
        exception: function(proxy, response, options) 
            //error case
        
    ,

    afterRequest: function(request, success) 
        var resText = request.operation.response.responseText,
            allThings = Ext.decode(resText),  //Decodes (parses) a JSON string to an object
            things = allThins.children,       //Now we have an object an we can do what we want...
            length = things.length;

        for (var i = 0; i < length; i++) 
            things[i].leaf = true;
            things[i].expanded = true;
        

        this.setRootNode(allThings); 
    

这只是一些伪代码,但它应该可以工作! 设置调试器语句 (Link),看看你真正得到了什么!

我希望这会有所帮助!

【讨论】:

【参考方案2】:

您可以尝试遍历响应存储并创建子节点。 然后将你的孩子附加到你的根节点

store.each(function(rec)   
  var childNode ;  
  //Create a new object and set it as a leaf node (leaf: true)  
  childNode = Ext.create('Model_Name',   
       id: rec.data.id,  
       name: rec.data.name,
       text : rec.data.name,  
       leaf : true,  
  );  
  // add/append this object to your root node  
  treepanel.getRootNode().appendChild(childNode );  
 ); 

查看this link了解更多详情

【讨论】:

以上是关于如何填充没有子节点或叶子信息的 Ext.data.TreeStore?的主要内容,如果未能解决你的问题,请参考以下文章

2021-10-08:填充每个节点的下一个右侧节点指针。给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找

treeList如何删除一个叶子节点

如何删除一棵普通二叉树的叶子结点?

如何判断dom节点是最后的子节点

二叉树基础(上):如何遍历二叉树?

Leetcode练习(Python):树类:第113题: 路径总和 II:给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。 说明: 叶子节点是指没有子节点的节点。