Как избавиться от рекурсивных запросов AJAX для бездетного узла? - PullRequest
5 голосов
/ 23 мая 2011

проблема:

По словам автора, jsTree Documentation :

При открытии закрытого узла (у которого нет загруженных дочерних элементов) делается запрос AJAX.

Как мне настроить jsTree , чтобы избавиться от этих запросов данных AJAX, сделанных для каждого пустого / бездетного узла? Я хочу, чтобы мои пустые узлы оставались пустыми (или бездетными)!


Дано (упрощенно):

Контейнер данных JSON ( data.json )

{
    "data" : "Root node with no children",
    "children" : []
}

jsTree configuration

{
    "json_data" : {
        "ajax" : {
            "url"        : "data.json",
            "type"       : "GET",
            "dataType"   : "json",
            "dataFilter" : function (data, type) {
                //some filtering function
            }
        }
    },
    "plugin" : ["json_data"]
}

Ответы [ 5 ]

11 голосов
/ 11 августа 2011

Пометить состояние листового узла как «лист».Это должно исправить это.

1 голос
/ 09 мая 2014

У меня была эта проблема при установке атрибута состояние = "закрыто" на бездетных узлах для деревьев XML.Удаление атрибута состояния решает проблему.

0 голосов
/ 06 октября 2012

Я тоже боролся с этой проблемой.Я получил основную идею от jsTree - загрузка подузлов через ajax по требованию

Основная проблема заключается в том, что когда мы щелкаем дочерний узел, который не настроен на лист, генерируется новый запрос AJAXс URL мы установили в древовидной конфигурации.Хитрость, показанная в приведенной выше ссылке, заключается в предоставлении функции вместо статической строки URL.Мой jstree используется для отображения структуры каталогов на сервере, поэтому я могу организовать динамическое добавление в URL для подкаталогов.Если вы назначите функцию свойству url свойства ajax в вашей конфигурации jstree, функция получит узел, который вы щелкнули, в качестве аргумента.Мои узлы отображают имена каталогов или файлов, поэтому я могу использовать функцию text () для получения необработанного имени каталога.Кажется, перед именем, возвращаемым таким образом, есть некоторое пространство, поэтому я использовал функцию String trim (), а затем encodeURIComponent, чтобы дать мне что-то, что я могу использовать в URL.

Если -1 передается в функцию url, то вы в корне и можете безопасно использовать свой базовый URL.Теперь это работает только для первого уровня иерархии.У меня есть немного больше работы, добавив полный путь к метаданным узла или что-то в этом роде, но эта идея может поставить вас на правильный путь.Похоже, что это не совсем ошибка, но по замыслу.Вы должны убедиться, что запрос, инициированный подузлом, отправляет подходящий URL на сервер.

Вот свойство url, которое я назначил объекту ajax в моей конфигурации jstree:

"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

0 голосов
/ 24 мая 2011

Просто пропустите атрибут детей.Очевидно, у вашего узла нет дочерних элементов, но вы указываете атрибут?Просто пропустите его, узел будет отображаться как конечный узел, и больше никаких запросов не будет.

0 голосов
/ 24 мая 2011

У меня была похожая проблема пару недель назад. У меня был вызов функции в поле «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"){

Чтобы узнать, какие функции вызываются.

...