Заполнение JSTree данными JSON, полученными в AJAX

Я пытаюсь заполнить JSTree данными JSON, которые я получаю от службы (которая вызывается с использованием ajax). Однако в файле jquery.jstree.js я получаю сообщение "Ни данные, ни параметры установки ajax". Из-за этого JSTree просто отображает загрузочный файл.

Код AJAX (отредактирован, чтобы попытаться настроить json на локальный тест переменной, затем выполнить тест)

function getJSONData() {
    var test;
    $
            .ajax({
                async : true,
                type : "GET",
                url : "/JavaTestService/rs/TestService/MyFirstTestService?languageCode=en_US&version=2",
                dataType : "json",

                success : function(json) {
                    test = json;
                },

                error : function(xhr, ajaxOptions, thrownError) {
                    alert(xhr.status);
                    alert(thrownError);
                    test = "error";
                }
            });
    return test;
}

Код JSTree

var jsonData = getJSONData();
createJSTrees(jsonData);

function createJSTrees(jsonData) {
        $("#supplierResults").jstree({
            "json_data" : {
                "data" : jsonData
            },
            "plugins" : [ "themes", "json_data", "ui" ]
        });

После некоторой отладки я обнаружил, что jsonData является undefined при передаче методу createJSTrees. Правильно ли я извлекаю эти данные в коде Ajax? Спасибо заранее

Ответ 1

Я раньше не тестировал ваш подход, когда вы предоставляете параметр данных непосредственно в плагин json_data, поэтому я не смогу предоставить ответ на этот сценарий.

Однако, поскольку вы используете вызов AJAX для получения данных, не можете ли вы отправить вызов AJAX в JSTree и позволить ему обрабатывать вызов самостоятельно? Вот как я настроил вызов AJAX в своем коде:

        (...)
        'json_data': {
            'ajax': {
                'url': myURL,
                'type': 'GET',
                'data': function(node) {
                    return {
                        'nodeId': node.attr ? node.attr("id") : ''
                    };
                }
            },
            'progressive_render': true,
            'progressive_unload': false
        },
        (...)

Ответ 2

jsonData - это undefined, потому что getJSONData() не возвращает значение. Вы не можете полагаться на возвращаемое значение из обработчика успеха $.ajax, если вы не назначили переменную local getJSONData(), которая возвращается после завершения вызова $.ajax. Но вам нужно что-то подобное, что также полезно для асинхронности:

<script type="text/javascript">    

$(function() {
    $.ajax({
        async : true,
        type : "GET",
        url : "/JavaTestService/rs/TestService/MyFirstTestService?languageCode=en_US&version=2",
        dataType : "json",    

        success : function(json) {
            createJSTrees(json);
        },    

        error : function(xhr, ajaxOptions, thrownError) {
            alert(xhr.status);
            alert(thrownError);
        }
    });
});    

function createJSTrees(jsonData) {
    $("#supplierResults").jstree({
        "json_data" : {
            "data" : jsonData
        },
        "plugins" : [ "themes", "json_data", "ui" ]
    });
}    

</script>