12

我正在尝试使用从服务(使用 ajax 调用)获取的 JSON 数据填充 JSTree。但是,我在 jquery.jstree.js 文件中收到“既没有提供数据也没有提供 ajax 设置错误”。因此,JSTree 只显示加载 gif。

AJAX 代码(编辑尝试将 json 设置为局部变量 test,然后返回 test)

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;
}

JS树代码

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

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

经过一些调试,我发现 jsonData 在传递给 createJSTrees 方法时是未定义的。我是否在 Ajax 代码中正确检索了该数据?提前致谢

4

2 回答 2

7

jsonData 未定义,因为 getJSONData() 不返回值。您不能依赖 $.ajax 成功处理程序的返回值,除非您为 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>
于 2013-06-04T16:54:41.780 回答
1

我之前没有测试过你的方法,你直接将 data 参数提供给 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
        },
        (...)
于 2013-06-04T16:37:14.297 回答