如何摆脱对无子节点的递归AJAX请求?

问题描述

| 问题: 根据jsTree文档的作者:   当打开一个关闭的节点(没有加载的子节点)时,会发出AJAX请求。 如何配置jsTree摆脱对每个空/无子节点发出的这些AJAX数据请求?我希望我的空节点保持空(或没有孩子)! 给定(简体): JSON数据容器(data.json)
{
    \"data\" : \"Root node with no children\",\"children\" : []
}
jsTree配置
{
    \"json_data\" : {
        \"ajax\" : {
            \"url\"        : \"data.json\",\"type\"       : \"GET\",\"dataType\"   : \"json\",\"dataFilter\" : function (data,type) {
                //some filtering function
            }
        }
    },\"plugin\" : [\"json_data\"]
}
    

解决方法

将叶节点的状态标记为\“ leaf \”。那应该解决它。     ,我在为XML树的无子节点上设置属性state = \“ closed \”时遇到了这个问题。删除状态属性可以解决此问题。     ,几周前,我遇到了类似的问题。我在\“ url \”字段中进行了一个函数调用,最终导致了Java代码,该代码基于SQL查询生成了JSON字符串。因此,当我单击一个无子级的封闭节点时,该函数再次被调用,从而产生一棵无尽的树。 我解决这个问题的方法是:
\"json_data\" : {
        \"ajax\" : {
            \"url\" : \"getAreaTree?treeType=Areas&ownerPhone=<%=webSessionObject.getUserPhoneNum()%>\",\"data\" : function (n) {
                    return { id : n.attr ? n.attr(\"id\") : 0 };
                }
        }
    },
\“ data \”中定义的函数结果将作为参数添加到\“ url \”函数。然后,我可以检查参数是0(初始加载)还是1(我的根的ID)或其他。 如果这对您不起作用,也许您可​​以尝试执行以下操作:
.bind(\"before.jstree\",function(event,data){
    if(data.func === \"create\"){
                  var foo = true;
        data.inst._get_node(null,true).each(function () {

            if(this.id!=rootId && this.id!=0){
                foo = false;    
        })
        if(!foo){
            event.stopImmediatePropagation();
            return false;
        }
    }       
})
我不确定这是否可行。 \“ before.jstree \”在所有事件之前触发。我正在检查要触发的函数是否为“创建”,如果是,请检查所选节点的ID。如果不是我的root的ID或0(初始加载),我将停止创建函数。 对于不同的情况,我使用类似的结构,因此应该可以使用。可能是\“ create \”事件不是您应该绑定的事件。您可以将其更改为
.bind(\"before.jstree\",data){
            console.log(data.func)
    if(data.func === \"create\"){
查看调用了哪些函数。     ,只需跳过children属性。显然,您的节点没有子节点,但是您指定了属性?只需跳过该节点,该节点将被呈现为叶节点,并且不再进行任何请求。     ,我也一直在努力解决这个问题。我从jsTree得到了主要思想-按需通过Ajax加载子节点 基本问题是,当我们单击未设置为叶子的子节点时,将使用在树配置中设置的URL生成一个新的AJAX请求。在上面的链接中看到的技巧是提供功能而不是静态URL字符串。我的jstree用于在服务器上显示目录结构,因此我可以安排动态添加到子目录的URL。如果在jstree配置中将函数分配给ajax属性的url属性,则该函数将接收您单击的节点作为参数。我的节点显示目录或文件的名称,因此我可以使用text()函数获取原始目录名称。以这种方式返回的名称前面似乎有一些空格,因此我使用了String trim()函数,然后使用了编码URIComponent给我可以在URL中使用的内容。 如果将-1传递给url函数,则说明您已经处于根目录,并且可以安全地使用基本URL。现在,这仅适用于层次结构的第一级。我还有很多工作要做,将完整路径添加到节点的元数据中或类似的东西,但是这个想法可能会使您走上正确的道路。看起来并非完全是错误,而是设计使然。您必须确保由子节点触发的请求将合适的URL发送到服务器。 这是我在jstree配置中分配给ajax对象的url属性:
\"url\": function (node) {
    var subDirectory = \"\",url = \"\";
    if (node === -1)
    {
        url = \"/tree_service/tree/format/json?path=exercises\";
    }
    else
    {
        subDirectory = encodeURIComponent(node.text().trim());
        url = \"/tree_service/tree/format/json?path=exercises/\" + subDirectory;
    }
    return url;
}
我的计划是通过轮询节点的完整路径来累积构建URL,然后如上所述添加节点的名称以创建最终URL。伪代码:
//haven\'t figured out how to add the path to the node and then retrieve it
path = node.metadata.path;
path = encodeURIComponent(path);
subDirectory = encodeURIComponent(node.text().trim());
url = path + \"/\" + subDirectory;
更新 在这里查看我的答案如何获取jsTree的元数据。关于使用node.data()。path从节点获取元数据