jQuery-动态树延迟加载和多层次(类型3)选择模式

jQuery-动态树延迟加载和多层次(类型3)选择模式,jquery,dynatree,jquery-dynatree,Jquery,Dynatree,Jquery Dynatree,我正在使用dynatree,将selectMode设置为3(多层次)。我也使用复选框,所以当你选择一个文件夹时,它下面的所有子文件夹都会被选中 我已经(并且需要)启用了延迟加载 问题在于,在选择文件夹时,动态树不会加载所有子项。它只选择以前加载过的子项 我希望它在进行多层次选择之前进行必要的延迟加载,以获取所有可用的子项。如果我没有读错,那么您在“检查”父项时是否正在尝试“检查”子项?这不起作用,因为当使用惰性加载时,子对象还不存在 我通过检查我在惰性负载上添加的子项的父项是否为“选中”来解决这

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

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

问题在于,在选择文件夹时,动态树不会加载所有子项。它只选择以前加载过的子项


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

如果我没有读错,那么您在“检查”父项时是否正在尝试“检查”子项?这不起作用,因为当使用惰性加载时,子对象还不存在

我通过检查我在惰性负载上添加的子项的父项是否为“选中”来解决这个问题。如果父项为“已选择”,则我加载已选择的子项

下面是一些代码供您查看。我正在从XMLHTTPREQUEST获取树数据。
treeArray[0]=父项密钥、treeArray[1]=子项密钥和treeArray[2]=子项标题

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]);
    }
}

我通过在惰性阅读后强制选择父对象来解决此问题:

onLazyRead: function (node) {
    if (!node.data.isLeaf) {
        node.appendAjax({
            success: function (node, event) {
                node.toggleSelect();
                node.toggleSelect();
            }
        });
    }
}

我知道我来晚了一点,但我也找到了解决办法。希望它能帮助别人

首先,您需要一个树的
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();
            }
        }
    });
}

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

可能是开始显示一些代码的好地方