У меня была похожая проблема пару недель назад. У меня был вызов функции в поле «url», что в итоге привело к появлению Java-кода, который создал строку JSON на основе SQL-запроса. Поэтому, когда я нажал на бездетный закрытый узел, функция была вызвана снова, в результате чего появилось бесконечное дерево.
способ, которым я решил это был:
"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 (идентификатор моего корня) или что-то еще.
Если это не работает для вас, возможно, вы могли бы попробовать что-то вроде этого:
.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» срабатывает перед всеми событиями. Я проверяю, является ли функция, которая должна запускаться, «создать», и если это так, я проверяю идентификатор выбранного узла. Если это что-то кроме идентификатора моего root или 0 (начальная загрузка), я прекращаю функцию create.
Я использую аналогичную структуру для другой ситуации, поэтому что-то вроде этого должно работать. Вполне возможно, что событие «создать» - это не то, к чему вы должны привязываться. Вы можете изменить его на
.bind("before.jstree",function(event,data){
console.log(data.func)
if(data.func === "create"){
Чтобы узнать, какие функции вызываются.