【问题标题】:appendChild tree node does not expandappendChild 树节点不展开
【发布时间】:2014-09-29 15:16:23
【问题描述】:

我有一个树面板,我在初始加载时设置了一些根级节点。然后当打开一个节点时,我有一个 javascript 函数,它在它下面添加子节点。

我有一个问题,我无法让节点可扩展。它没有显示展开节点的箭头。

这是我添加子节点的方法:

var onbeforeitemexpand = function(node, options) {
    if (!node.hasChildNodes()) {
        node.appendChild({
            title:'Should not be expandable',
            checked: false,
            leaf:true
        });
        node.appendChild({
            title:'Should expand',
            checked: false,
            leaf:false,
            expandable:true
        });

};

tree.on('beforeitemexpand', onbeforeitemexpand, null);

但第二个孩子不可扩展。我可以让它变得可扩展的唯一方法是像这样向它添加空子:

        node.appendChild({
            title:'Should expand',
            checked: false,
            leaf:false,
            expandable:true,
            children:[{}]
        });

但是它下面会有一个空节点,当我尝试在这个节点下添加子节点时,子节点会进入空节点。

有没有更好的方法通过我自己的 javascript 函数(而不是通过 ajax 请求..)来“延迟加载”树?

【问题讨论】:

    标签: javascript extjs tree extjs4.2 treepanel


    【解决方案1】:

    无论我尝试什么,当我通过函数将节点添加到树时,我都无法将 > 箭头指向节点。我尝试了上述解决方案和自定义代理阅读器。我终于解决了这个问题:

            Ext.define('Ext.proxy.DocumentNodes', {
                extend: 'Ext.data.proxy.Memory',
                alias: 'proxy.documentnodes',
                read: function(operation, callback, scope) {
                    var parent=operation.node;
                    var children=[];
                    children.push(
                        Ext.create('Document',{
                            title:'Some document',
                            iconCls:'task-folder',
                            checked: false,
                            leaf: false,
                            expandable: true,
                            children: [{tempitem: true}]
                        })
                    );
                    var result=Ext.create("Ext.data.ResultSet",{records: children});
                    Ext.apply(operation, {resultSet: result});
                    operation.setCompleted();
                    operation.setSuccessful();
                    Ext.callback(callback, scope || this, [operation]);
                }
            });
    
            Ext.define('Document', {
                extend: 'Ext.data.Model',
                fields: [
                    {name: 'title', type: 'string'},
                ]
            });
    
            var store = Ext.create('Ext.data.TreeStore', {
                model: 'Document',
                proxy: {
                    type: 'documentnodes'
                },
                nextId: 1,
                folderSort: false
            });
    

    然后将该商店用于树面板,并为树设置 onbeforeitemexpand 侦听器,如下所示:

            var onbeforeitemexpand = function(node, options) {
                var firstChild = node.getChildAt(0);
                if (firstChild.get('tempitem')) {
                    node.removeChild(firstChild, true);
                }
                node.store.load({ node: node });
            };
    
            tree.on('checkchange', oncheckchange, null);
            tree.on('beforeitemexpand', onbeforeitemexpand, null);
    

    这一切的作用是,代理阅读器首先创建节点并在其下方添加一个空节点,因此 > 箭头出现在节点之前。然后在 beforeitemexpand 它检查第一个节点是否是临时节点并将其删除并调用该节点的重新加载,然后执行代理读取器,该代理读取器在已打开的节点下方添加新节点,并在其下方添加临时节点...

    这样做看起来很愚蠢,但它有效,我不知道如果节点中没有任何子节点但叶子设置为,我还能如何让 > 箭头出现在节点之前false 和可扩展设置为 true。

    也许有人对此有更好的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 2019-08-30
      • 2014-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多