使用延迟加载时,dynatree selectmode = 3不受尊重

时间:2012-10-17 09:03:24

标签: lazy-loading dynatree

我试图在我的项目中使用延迟加载的dynatree。 当我尝试将选择功能与复选框和选择模式3结合起来时,我很失望地看到模式3的选择规则选择了所有内容,包括选择父项时的子项....子项。 这是因为孩子还没有被装上。

有没有人有办法解决这个问题?我非常感谢任何建议。 Zank ya !!

2 个答案:

答案 0 :(得分:0)

添加所选父级的子级时,请检查父级是否有子级。如果为TRUE,则添加每个子项并将每个子项设置为选中。

以下是一些代码。 onLazyRead将达到顶峰。每次单击延迟节点时,都会触发此功能。在这个函数里面应该是对你的函数的调用,它为你刚刚选择的节点提取子数据。

下面的代码就是我解决这个问题的方法。几乎所有它正在检查是否选择了要添加的节点的父节点。如果为TRUE,则添加节点,然后.select()

取消选择节点时,这更加简单,因为所有节点都已加载。取消选择时,只需从正在取消选择的节点向下查看树的层次结构,然后只需取消选中每个节点。

我知道这很多代码只是向你投掷,但希望你能从中汲取这个想法。如果你不能,我会在工作期间尝试检查这个帖子。也许你甚至可以发布你到目前为止的内容?

onLazyRead: function(node){

jQuery("#tree2").dynatree("getTree").disable();

        var pParentID = node.data.key;          

                    //Select the Node

        doChildReport(pParentID); //Get Children for this node's ID

    },


///....
//Methods to grab data from a "XMLHttpRequest GET" go here
//....

//When you finally want to add the children that you fetched using the ID of the node you selected...

//treeArray is an array of node data that has been parsed out of a 
//string returned by a "XMLHttpRequest GET"

//Contents of array in order, repeating: treeArray[0] = ParentID, [1] = nodeID [2] = nodeName
//Example, the array would return [111], [222], ["Child Node"]


if(){ //IF Next fetched node is on the last level, ie. no children
            //add normally
        }
    else{  //If NOT, add lazy.
        if(treeArray[1] != "nill" && treeArray[1] != undefined){

        //IF THE PARENT NODE IS SELECTED
        if(jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[0]).isSelected() == true){

        //AND IF the child node does not exist
        if(jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]) == null){

            //Add the child node and then mark it selected
            addChildNodeLazy(treeArray[1], treeArray[2], treeArray[0]);
            jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]).select();
        }   
        }else{
            if( jQuery("#tree2").dynatree("getTree").getNodeByKey(treeArray[1]) == null){
                addChildNodeLazy(treeArray[1], treeArray[2], treeArray[0]);
            }
        }
    }
}

延迟加载功能......

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

答案 1 :(得分:0)

不可否认,以下是一个黑客攻击......但它解决了这个问题:

onSelect: function (flag, node) {
    if (flag && node.childList == undefined) {
        node.reloadChildren(function() {
            node.select(false);
            node.select(true);
        });
    }

如果正在选择节点(flag == true)并且尚未加载节点(childList == undefined),则使用回调函数调用reloadChildren。加载数据后回调运行,只需关闭/打开复选框即可。这会导致选择所有子节点(现在存在)。