【问题标题】:Losing formatting on reload of data on AJAX call在 AJAX 调用上重新加载数据时丢失格式
【发布时间】:2020-05-27 11:52:29
【问题描述】:

当我使用 AJAX 调用中的数据重新加载 jstree 时遇到问题。所以在加载时它工作正常,但是添加数据并得到响应,树失去了它的结构

初始 html 是一个空的 div,使用 ajax 在按钮点击时更新数据

<div id="pnlTree">                  

  <div id="jstree" style="text-align: left">

  </div>
</div>

success: function (data) 
        {
            if( data )
            {
                    var output = '<ul class="appointmentlist">';
                    $.each(data, function(key, val){

                        output += "<li id='"+data[key].data1+"' name='dtpurchase'"+counter+"' value='" + data[key].data2 + "'>" +dtdata + "</li>";
                        //output += '<a id="dtappointment" name="dtpurchase" value="' + data[key].data3 + '"'+ '>'+data[key].purchase_date + '</a>';
                         //output += '</li>';
                         counter++;

                    });
                    output += '</ul>';
                $('#jstree').html(output);
            }

        },

我尝试过刷新、重新加载,但似乎没有任何解决问题的方法。

【问题讨论】:

  • 这可能有助于显示 HTML 在 AJAX 调用之前的样子以及从 AJAX 调用返回的数据的样子。然后我们可以检查差异是什么等。
  • 它是一个带有 ul 的空 div。我在加载页面时加载数据。我添加了一个约会并刷新来自 db 的调用以提取约会列表。在这个阶段,它失去了它的 jstree 格式,但数据正在加载
  • 我认为这是因为 jstree 已经在文档加载时初始化,并且需要在返回数据时重新初始化。我会看看我是否可以为你重新创建一个示例

标签: javascript jquery jstree


【解决方案1】:

您需要做的就是在更新数据后refresh() 树。 现在这仅在您将日期附加到带有$("#jstree").jstree(true).settings.core.data = output 的元素时才有效。如果你使用$('#jstree').html(output) 那就不行了

运行 sn-ps 以查看它的实际效果:

工作:

$('#jstree').jstree()

function update() {
  var output = `<ul><li>New Item</li></ul>`
  $("#jstree").jstree(true).settings.core.data = output
  $('#jstree').jstree(true).refresh();
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>

<div id="jstree">
  <ul>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
  </ul>
</div>

<button onclick="update()">Update data</button>

好的,所以第二个使用 AJAX。它在 Stack Overflow 沙箱中不起作用,但它在普通 HTML 页面上起作用(见屏幕截图)。这是完全相同的概念,您只需要按正确的顺序应用它:

$('#jstree').jstree()

function update() {
  $.ajax({
    url: "https://swapi.dev/api/people/1", 
    success: function(data){
      var output = `<ul>
        <li>${data.name}</li>
        <li>${data.eye_color}</li>
        <li>${data.height}</li>
      </ul>`
      $("#jstree").jstree(true).settings.core.data = output
      $('#jstree').jstree(true).refresh();
    }
  });
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>

<div id="jstree">
  <ul>
    <li>Item</li>
    <li>Item</li>
    <li>Item</li>
  </ul>
</div>

<button onclick="update()">Update data</button>

【讨论】:

  • 嗨 Ludolfyn,谢谢,我现在有个主意。但是,当我使用 $("#jstree").jstree(true).settings.core.data 时。我收到未定义设置的错误。我认为这可能是因为我正在使用从按钮单击重新加载的单独 ajax 调用
  • 嘿@edcoder。嗯,如果您在成功状态下添加数据,AJAX 调用应该不是问题。让我看看是否可以更新示例以包含 AJAX 调用
  • 你认为这也可能是我的 jstree 中缺少的设置。我设置的唯一初始化树是 $("#jstree").jstree({ });数据在 ajax 成功状态下加载。
  • @edcoder ,我在答案中添加了一个 AJAX 示例。我认为您不必设置任何设置。我认为这只是以正确的顺序调用函数的问题,仅此而已。我没有设置任何设置,就和你一样做了。我也只是初始化了一次,就是这样。我的初始化看起来有点不同。我没有空对象 ({}) 作为参数。也许只是尝试$("#jstree").jstree(),没有{}
  • 嗨 Ludolfyn,谢谢。按照您的示例并删除了大括号。我很感激你花时间清楚地解释。更多积分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多