我可以使用预加载了JSON数据的jsTree,并同时使用Ajax吗?

3
我已经成功使用JSON数据使jsTree工作:JSON数据表示服务器的文件系统,用户可以从树形结构中选择一个文件夹,然后将其添加到文件夹输入字段中。我不希望页面在未提供顶层三个级别的文件系统的情况下加载。但是,我不解析整个文件系统,因为这需要太长时间。

我能否使用预先填充的JSON数据预先填充jsTree,并在用户打开未预先填充的树下进一步节点时使用Ajax,或者我必须在初始加载时也使用Ajax?

以下是我的当前代码(没有任何Ajax),但仅出于简洁起见,仅检索到一级数据:它从服务器返回C:\E:\文件系统。 这很有效,但我不清楚如何引入Ajax,当用户尝试打开更深层次的节点时。

    <label for="folder">Selected Folder</label>
    <input type="text" name="folder" id="folder">
    <br>
    <script type="text/javascript">
    function createJSTree(jsondata) 
    {            
      $('#jstree').jstree(
        {
          "plugins" : ["themes","html_data","ui","cookie"],
          'core': 
          {
              'data': jsondata
          }
        }
      )
      .bind("select_node.jstree",   
                function (e, data) 
                {
                    var objNode = data.instance.get_node(data.selected);
                    document.getElementById('folder').value=objNode.id;
                }
        )
      ;
    }

    $(function() { var jsondata ={"text":"pclaptop","children":[{"id":"C:\\","text":"C:\\","children":[]},{"id":"E:\\","text":"E:\\","children":[]}]}; createJSTree(jsondata); })
    </script>

你使用的jsTree版本是多少? - Jonathan Chaplin
@JonathanChaplin 我认为最新的版本是3.3.5。 - Paul Taylor
1个回答

0
在我讲解代码的ajax部分之前,我必须设置jsTree中的check_callback参数以启用jsTree的编辑功能。接下来,在jQuery的ajax调用成功方法中调用`$('#jstree').jstree().create_node('#',parsedData,"last");就能解决问题了。我的解决方案如下:

index.html

<label for="folder">Selected Folder</label>
    <input type="text" name="folder" id="folder">
    <br>
    <button id="create-node-button">
       Create Node
    </button>
<div id="jstree"></div>
<script type="text/javascript">
    function createJSTree(jsondata) {
        $('#jstree').jstree({
                "plugins": ["themes", "html_data", "ui", "cookie"],
                'core': {
                    'check_callback': true,
                    'data': jsondata
                }
            })
            .bind("select_node.jstree",
                function(e, data) {
                    var objNode = data.instance.get_node(data.selected);
                    document.getElementById('folder').value = objNode.id;
                }
            );
    }

    $(function() {
        var jsondata = [{
                "id": "pclaptop",
                "parent": "#",
                "text": "pclaptop"
            },
            {
                "id": "C:\\",
                "parent": "pclaptop",
                "text": "C:\\"
            },
            {
                "id": "E:\\",
                "parent": "pclaptop",
                "text": "E:\\"
            },
            {
                "id": "F:\\",
                "parent": "pclaptop",
                "text": "F:\\"
            }
        ];
        createJSTree(jsondata);

        $("#create-node-button").on("click", function() {
            $.ajax({
                url: "./data.json",
                success: function(data){
                    var parsedData = JSON.parse(data);
                    $('#jstree').jstree().create_node('#', parsedData, "last");
                }
            });
        });
    });
</script>

data.json

{ "id" : "ajson5", "text" : "newly added" }

最后,这里有个小例子 。我不太确定在jsfiddle中如何正确设置ajax调用,所以我选择了本地操作。

谢谢你迄今为止的帮助,但我希望在单击节点时打开节点内容而不是单独的按钮,并且从用户的角度来看,它并没有创建数据,只是根据需要从服务器检索数据,而不是尝试一次性检索所有数据。从另一个执行此操作的应用程序中看到,每个子级左侧应该有一个小白色箭头,并且单击箭头以打开它应该调用ajax调用。 - Paul Taylor
明白了,按钮很容易解决。但是,我不确定您对服务器功能的期望是什么,这就是为什么该部分在json文件中被硬编码的原因。您能提供更多细节吗? - Jonathan Chaplin
服务器功能并不是问题,它应该为已单击的树节点提供正确的 JSON 数据,但我可以做到这一点。我的问题在于正确配置 jstree 代码,以便它调用服务器(或模拟)并使用返回的数据。 - Paul Taylor
好的,我已经移除了按钮并更新了我的fiddle。https://jsfiddle.net/74xmw78b/15/。稍后我会更新我的答案。 - Jonathan Chaplin
谢谢你的帮助,非常有用。但是我后来发现,尽管jstree网站并不那么有用,但在jstree github仓库的README中(https://github.com/vakata/jstree#populating-a-tree-using-an-array-or-json),对于lazy load ajax有很好的解释。因此,我基于此创建了一个更简单的解决方案,并会在适当的时候发布答案,但我会授予你赏金以感谢你的帮助。 - Paul Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接