【问题标题】:How to get jstree to work properly with ajax loaded content如何让 jstree 与 ajax 加载的内容一起正常工作
【发布时间】:2013-12-18 00:34:11
【问题描述】:

对于一个项目,我正在尝试创建一个基于 ajax 的树形视图控件。我的 ajax 脚本在后端运行良好,但树没有正确显示。当我将 ajax 响应硬编码到我的树容器中时,它会正确显示:

但是,当我尝试通过 ajax 加载树时,我得到了这个:

这是我的 JS 代码:

$(document).ready(function() {
    function customMenu(node) {
        var items = {
            createItem : {
                label : "Generate random number(s)",
                action: function() {
                    console.log("Creating children...");
                    var selectedId = $("#treeview").jstree("get_selected").attr("id");

                    $.ajax({
                        type: "GET",
                        contentType: "application/json; charset=utf-8",
                        url: "libs/add.php",
                        data: "fact_id=" + selectedId,
                        dataType: "json",
                        success: function(data) {
                            console.log(data);
                        }
                    });
                }
            }
        }

        return items;
    }

    $("#treeview").jstree({
        "plugins" : ["themes", "html_data", "ui", "crrm", "contextmenu"], contextmenu: {items: customMenu, select_node: true}
    });

    $.ajax({
        url: "libs/display.php",
        dataType: "json"
    }).success(function(data) {
        $("#treeview ul").append(data);
    });
});

有人知道我的问题是什么吗?任何帮助将不胜感激。

编辑 仔细观察后,我意识到确切的问题是通过 ajax 调用时没有将必要的类添加到子节点。不过,我不知道为什么。

另一个编辑 display.php 现在包含此响应文本:

[
    {
        "attr": {
            "id": 1
        },
        "data": 649,
            "state": "closed"
    },
    {
        "attr": {
            "id": 1
        },
       "data": 108,
       "state": "closed"
    },
    {
        "attr": {
            "id": 1
         },
        "data": 86,
        "state": "closed"
    },
    {
        "attr": {
            "id": 1
        },
        "data": 46,
        "state": "closed"
     }
]

我的方向正确吗?

【问题讨论】:

    标签: javascript jquery ajax jstree


    【解决方案1】:

    您的样式表是否已包含在内,您是否为图标设置了正确的 URL?在我看来,这就是为什么您的数据没有被样式化的原因。 但是,查看您的代码,您没有获得样式的一个更可能的原因是您只是在 jsTree 范围之外调用任意 AJAX 调用。

    Take a look at the docs for the json_data plugin 用于 jsTree。它很容易使用,只要您正确设置display.php 以仅获取 jsTree 请求的节点。它将进行并发调用并获取它需要的节点,您的脚本只需要为它们提供服务即可:

    $("#treeview").jstree({
        "plugins" : ["themes", "html_data", "ui", "crrm", "contextmenu"],
        "contextmenu": {
            items: customMenu,
            select_node: true
        },
        "json_data": {
            "ajax": {
                "url": "libs/display.php",
                "data": function(n) {
                    return { id : n.attr ? n.attr("id") : 0 
                }                        
            }
        }
    });
    

    json_data 插件基本上充当 jQuery AJAX 调用的包装器,但事件直接绑定到 jsTree 核心,返回的结果由 jsTree 处理。您可能需要根据 display.php 的响应以及您将树设置为结构上的样子稍微调整返回值。

    编辑

    这是一篇类似的帖子,可能会对您有所帮助: jsTree and AJAX > Load all data via ajax

    【讨论】:

    • 感谢您的回答。那么display.php 的回复应该是什么格式呢?目前,它只是整个有序列表的 JSON 编码版本。
    • 在我链接到的那个文档页面的顶部,有两个你应该返回的数据结构示例。这些示例与我从文档中复制的上述示例直接相关,因此,如果您的示例不同,则需要相应地调整上面的代码和 display.php 输出
    • 例如,在我的应用程序中,我返回这个:[{"data":{"title":"Node Title"},"attr":{"id":1,"rel":"node-type"},"state":"closed"}]
    • 再次感谢您迄今为止的帮助。我想我已经修复了我的display.php 脚本,但我仍然不太确定如何显示它。请查看我对原始帖子的最新编辑。
    • 我认为您根本不需要指定孩子。它的工作方式正好相反,jsTree 将调用display.php 并指定一个它想要所有第一级子级的节点ID。如果您指定state: open 而不是closed,那么它也应该去寻找这些节点的子节点。所以display.php 应该接受$_GET['id'] 之类的参数,并会查找该ID 的所有孩子,然后返回一个像您一样的格式化结果,而不列出所有孩子。如果您还想自动加载这些节点的子节点,请使用 state: open
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 2016-03-16
    • 2019-04-27
    • 1970-01-01
    相关资源
    最近更新 更多