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

时间:2011-05-23 10:26:16

标签: json jquery jstree

问题:

据作者说,jsTree Documentation

  

当打开一个关闭的节点(没有加载的子节点)时,会发出一个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"]
}

5 个答案:

答案 0 :(得分:11)

将叶节点的状态标记为“leaf”。那应该解决它。

答案 1 :(得分:1)

我遇到了这个问题,设置属性state ="关闭"在XML树的无子节点上。删除state属性可以解决问题。

答案 2 :(得分:0)

几周前我遇到过类似的问题。我在“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(我的root的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”开火。我正在检查要触发的函数是否为“create”,如果是,我检查所选节点的id。如果它不是我的root的id或0(初始加载),我停止创建函数。

我对不同的情况使用类似的结构,所以这样的事情应该有效。可能是“创建”事件不是你应该绑定的事件。您可以将其更改为

.bind("before.jstree",function(event,data){
            console.log(data.func)
    if(data.func === "create"){

查看调用哪些函数。

答案 3 :(得分:0)

跳过children属性。显然你的节点没有子节点,但你指定了属性?只需跳过它,节点将呈现为叶节点,不会再发出任何请求。

答案 4 :(得分:0)

我也一直在努力解决这个问题。我从jsTree - loading subnodes via ajax on demand

得到了主要想法

基本问题是,当我们单击未设置为leaf的子节点时,将使用我们在树配置中设置的URL生成新的AJAX请求。在上面的链接中看到的技巧是提供一个函数而不是静态URL字符串。我的jstree用于在服务器上显示目录结构,因此我可以安排动态添加到子目录的URL。如果将函数分配给jstree配置中ajax属性的url属性,则该函数将接收您单击的节点作为参数。我的节点显示目录或文件的名称,因此我可以使用text()函数来获取原始目录名称。在这个方式返回的名称前面似乎有一些空间,所以我使用了一个String trim()函数,然后使用encodeURIComponent来给我一些我可以在URL中使用的东西。

如果将-1传递给url函数,那么您可以在root用户处安全地使用基本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;

<强>更新 请参阅我的答案how to get the metadata of jsTree.,了解如何使用node.data()。path

从节点获取元数据