我试图在我的项目中使用延迟加载的dynatree。 当我尝试将选择功能与复选框和选择模式3结合起来时,我很失望地看到模式3的选择规则选择了所有内容,包括选择父项时的子项....子项。 这是因为孩子还没有被装上。
有没有人有办法解决这个问题?我非常感谢任何建议。 Zank ya !!
答案 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。加载数据后回调运行,只需关闭/打开复选框即可。这会导致选择所有子节点(现在存在)。