Подтвердить что ты не робот

Почему jsTree open_all() не работает для меня?

Начните играть с jQuery и плагином jsTree вчера и успешно загрузите дерево с вызовом AJAX на сервлет. Теперь я хотел бы, чтобы дерево открыло все узлы после загрузки, поэтому я добавил функцию успеха в атрибут ajax. Однако я не могу заставить метод open_all() работать правильно. Я очень новичок в работе с jQuery, поэтому я предполагаю, что это просто, что я делаю неправильно.

Firebug не показывает никаких ошибок, исключающих туманную ошибку ошибочного имени метода. Я проверил документацию, и я думаю, что делаю все правильно в соответствии с тем, что я читаю. Дерево загружается правильно, но не открывает все узлы после загрузки страницы.

Я использую jQuery 1.4.2 и jsTree 1.0rc2 в Firefox 3.6.8.

Вот код, который я использую, чтобы загрузить дерево и попытаться открыть все узлы в дереве:

// Create the tree object
$("td#modelXML").jstree({
    core : { "animation" : 0 },
    //xml_data : {"data" : "" + xml, "xsl" : "nest"},
    xml_data : {"ajax" : 
                    {"url" : "servlet/GetModelHierarchy", 
                    "type" : "post", "data" : { modelId : "" + modelId} }, 
                    "xsl" : "nest",
                    "success" : function(){
                                $(this).open_all(-1);
                                }
    },
    themes : {"theme" : "classic", "dots" : true, "icons" : true},
    types : { 
        "types" : {
            "category" : {
                "valid_children" : ["factor"]
            },
            "factor" : {
                "valid_children" : ["level"]
            },
            "level" : {
                "valid_children" : "none",
                "icon" : {
                    "image" : "${request.contextPath}/jsTree/file.png"
                }
            }
        }
    },
    plugins : ["themes", "types", "xml_data"]
});
4b9b3361

Ответ 1

Вам нужно подключиться к событиям, а затем вызвать open_all.

Чтобы все узлы были открыты при загрузке, используйте:

    var tree = $("#id-or-selector-for-my-tree-element");
    tree.bind("loaded.jstree", function (event, data) {
        tree.jstree("open_all");
    });

Сделайте это, прежде чем инициализировать дерево с помощью .jstree({...}).

Если вы обновите его, чтобы снова открыть все узлы, вы должны использовать:

    tree.bind("refresh.jstree", function (event, data) {
        tree.jstree("open_all");
    });

Ответ 2

Да, это старый вопрос, но без принятого ответа и единственный ответ, который мне не полезен, вот мой ответ, который я сейчас использую:

var tree = $("td#modelXML")
    .bind("loaded.jstree", function (e, data) {
        data.inst.open_all(-1); // -1 opens all nodes in the container
    })
    .jstree({ /* your jsTree options as normal */ });

Ключевым моментом здесь является то, что data.inst является вашим jsTree, и это единственная ссылка, которую вы будете иметь, поскольку tree не будет иметь значение до окончания .jstree({. Поскольку loaded.jstree вызывается в вызове .jstree({, результат еще не существует. См?

Ответ 3

Мне не удалось заставить его работать либо с tree.jstree('open_all'), либо data.inst.open_all(-1) - в конце концов мне пришлось использовать data.instance.open_all() - обратите внимание на изменение от inst до экземпляра и open_all (-1) до open_all() - оба из них, похоже, требуются с jQuery 1.11 и jstree 3.0.0. Мой последний блок кода выглядит следующим образом:

$(document).ready(function() {
    var tree = $('#jstree');
    tree.bind('loaded.jstree', function(event, data) {
        data.instance.open_all();   
    });
    tree.jstree({});
});

Ответ 4

Попробуйте это!

$("td#modelXML").jstree("open_all","#nodeID");