Остановить загрузку узлов при загрузке Ajax/отложенной загрузке в JSTree

Я использую JSTree с функциональностью Ajax Loading/Lazy Loading в своем приложении.

Теперь я пытаюсь открыть все узлы. Итак, в событии Loaded я пишу метод open_all, чтобы открыть все узлы.

$('#DIVTree').jstree({
        'core': {
            'multiple': false,
            'data': {
                'url': appRootDir + 'Tree/GetFilterList',
                'data': function (node) {
                    return { 'ID': node.id};
                }
            }
        },
        'plugins': ['state'],
}).on('loaded.jstree', function (node) {
    $('#DIVTree').jstree(true).open_all();
});

Теперь это начинает открывать все узлы, которые я действительно хотел.

Но теперь у меня есть еще одна кнопка «Отмена».

Я хочу разрешить пользователю прекратить загрузку узлов при нажатии кнопки отмены.

Я пробовал много способов. Я попытался реализовать рекурсию с событием «after_open» и событием «load_node».

$('#DIVTree').jstree({
        'core': {
            'multiple': false,
            'data': {
                'url': appRootDir + 'Tree/GetFilterList',
                'data': function (node) {
                    return { 'ID': node.id };
                }
            }
        },
        'plugins': ['state'],
}).on('load_node.jstree', function (node) {
        if (recrusiveStop == false) {
            OpenNodes();
        }
}).on('after_open.jstree', function (node) {
        if (recrusiveStop == false) {
            OpenNodes();
        }
});

var OpenNodes = function () {
    var nodeID = '';

    $('#DIVTree .jstree-closed').each(function () {
        if ($('#DIVTree').jstree(true).is_loaded(this.id) == false) {
            nodeID = this.id;
            return false;
        }
    });

    if (nodeID != '') {
        $('#DIVTree').jstree(true).open_node(nodeID);
    }
}

Но пока не получается реализовать.

В «after_open» событие запускается только один раз. Таким образом, расширяется только один узел (без подузла), поэтому он не остается в цикле. в то время как я все еще хочу расширить братьев и сестер.

Есть ли четкий способ реализовать это?

Я хочу открыть все узлы, а также остановить загрузку, когда пользователь нажмет кнопку отмены.


person Nirav Kamani    schedule 31.08.2015    source источник


Ответы (1)


Невозможно остановить загрузку после вызова open_all. Он будет загружаться до тех пор, пока в контейнере дерева не останется узлов с классом jstree-closed.

Возможно, вы могли бы подойти к этому по-другому — вернуть все вложенные дочерние элементы вместе с первым запросом. Таким образом, все будет загружаться одним (или несколькими) запросами, а не одним запросом для каждой ноды. При условии, что ваше дерево не слишком велико, это будет довольно быстро, и нечего будет отменять.

Извините, но другого решения, насколько я вижу, нет. Невозможно остановить вызов open_all.

person vakata    schedule 31.08.2015
comment
Привет, ваката, Мой TreeView слишком большой. Я показываю очень большие данные. Используя рекурсию, я думаю, что смогу достичь вышеуказанной функциональности. Но производительность снижается. Есть ли другой подход к работе с этим сценарием? Спасибо за поддержку. - person Nirav Kamani; 01.09.2015
comment
Вы можете создать простой минимальный плагин, который переопределяет функцию open_all и добавляет новую функцию stop_open_all. Все это может работать с простой переменной, которая будет указывать open_all на остановку. - person vakata; 01.09.2015
comment
Приведенный выше пример с «load_node» и «after_open» работает рекурсивно и позволяет мне остановить открытие узла. но, как я уже сказал, это снижает производительность. Спасибо, ваката! Попробую. - person Nirav Kamani; 01.09.2015