2

我正在使用将 selectMode 设置为 3(多层)的 dynatree。我也在使用复选框,所以当你选择一个文件夹时,它下面的所有子文件夹也会被选中。

我已经(并且需要)启用延迟加载。

问题是动态树在选择文件夹时不会加载所有子项。它仅选择先前已加载的子项。

我希望它在进行多层选择之前进行必要的延迟加载以获取所有可用的子级。

4

3 回答 3

1

我通过在懒惰阅读后强制选择父母来解决这个问题:

onLazyRead: function (node) {
    if (!node.data.isLeaf) {
        node.appendAjax({
            success: function (node, event) {
                node.toggleSelect();
                node.toggleSelect();
            }
        });
    }
}
于 2013-03-21T17:28:54.133 回答
1

如果我没看错,当您“检查”父母时,您是想“检查”孩子吗?这不起作用,因为在使用延迟加载时,孩子还不存在。

我通过检查我在延迟加载中添加的孩子的父母是否被“选中”来解决这个问题。如果父母被“选择”,我加载已经选择的孩子。

这是一些代码供您查看。我从 XMLHTTPREQUEST 获取我的树数据。
treeArray[0] = ParentKEY、treeArray[1] = ChildKEY 和 treeArray[2] = ChildTITLE

function addChildNode(NodeID, NodeName, ParentID){
    jQuery("#tree2").dynatree("getTree").getNodeByKey(ParentID).addChild({title: NodeName, key: NodeID, icon: false, isFolder: true, isLazy: false});
}

/*
*If treeArray[0] "ParentKEY" is selected, create the child already selected.
*/

if(jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[0]).isSelected() == true){
    if( jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]) == null){
        addChildNode(treeArray[1], treeArray[2], treeArray[0]);
        jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]).select();
    }
}else{
    if( jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]) == null){
        addChildNode(treeArray[1], treeArray[2], treeArray[0]);
    }
}
于 2012-03-29T17:21:27.360 回答
1

我知道我参加聚会有点晚了,但我也找到了解决办法。希望它可以帮助某人。

首先,你需要一个onSelect树的处理程序(如果你还没有的话)。当一个节点被选中时,将其标记为选中,然后尽可能展开它。这是我的:

onSelect: function(selected, node) {
    if (selected === true) {
        node.data.activateChildrenOnLoad = true; //Let the lazy children know
        //node.expand(true) did not work for me, but it might for you
        if (!node.isExpanded()) {
            node.toggleExpand();
        }
    }
}

onLazyRead接下来,您需要在函数中插入一些代码。我手动处理所有 AJAX,所以如果您让 dynatree 为您处理,您可能需要更改一些内容。

onLazyRead: function(node) {
    getNodesFromServer(function(nodes) {
        node.addChild({
            selected: node.data.activateChildrenOnLoad,
            activateChildrenOnLoad: node.data.activateChildrenOnLoad
        });

        if (node.data.activateChildrenOnLoad) {
            var nodes = node.getChildren();
            var last = nodes[nodes.length-1];
            if (!last.isSelected()) {
                last.toggleSelect();
            }
            if (!last.isExpanded()) {
                last.toggleExpand();
            }
        }
    });
}

这就是它的全部。当您选择(检查)一个节点时,它将递归地加载、检查和扩展其所有惰性子节点。

于 2013-06-20T13:50:54.370 回答