问题描述
|
问题:
根据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从节点获取元数据