jQuery 使用新的 json 数据重新创建整个 jstree 实例
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6836588/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Recreate entire jstree instance with new json data
提问by Tom
I wish to replace the entire contents of a jstree tree with new json data.
我希望用新的 json 数据替换 jstree 树的全部内容。
I'm using jsTree 1.0 downloaded July 25, 2011 from github
我使用的是 2011 年 7 月 25 日从 github 下载的 jsTree 1.0
Say I have this function...
说我有这个功能...
function init_my_tree(my_json_data)
{
$("#demo1").jstree({
themes: {
"theme": "classic",
"dots": false,
"icons": true,
"url": "//js.myliburl.com/jstree/themes/classic/style.css"
},
json : {
data : my_json_data
},
plugins : [ "core","ui","themes", "json" ]
});
}
where demo1 refers to a
其中 demo1 指的是
<div id="demo1"></div>
What I'm trying to do is to completely replace the tree with new data that I load from my server. For purposes of this question, however, let's pretend I just want to do this...
我想要做的是用我从服务器加载的新数据完全替换树。然而,出于这个问题的目的,让我们假装我只想这样做......
$(document).ready(function() {
var text_data = '[{"title":"All","data":{"jstree":{"opened":true}},"children":[{"title":"Item 1","data":{"jstree":{}},"children":false,"li_attr":{"id":"1","class":"jstree-leaf","href":"#"},"a_attr":{"href":"#"}},{"title":"Item B","data":{"jstree":{}},"children":false,"li_attr":{"id":"2","class":"jstree-last","href":"#"},"a_attr":{"href":"#"}}],"li_attr":{"id":"0","class":"jstree-last","href":"#"},"a_attr":{"href":"#"}}]';
var my_json_data = $.parseJSON(text_data);
init_my_tree(my_json_data); // initialize the tree view
text_data = '[{"title":"Something Else","data":{"jstree":{"opened":true}},"children":[{"title":"Item A","data":{"jstree":{}},"children":false,"li_attr":{"id":"1","class":"jstree-leaf","href":"#"},"a_attr":{"href":"#"}},{"title":"Item 2","data":{"jstree":{}},"children":false,"li_attr":{"id":"2","class":"jstree-last","href":"#"},"a_attr":{"href":"#"}}],"li_attr":{"id":"0","class":"jstree-last","href":"#"},"a_attr":{"href":"#"}}]';
my_json_data = $.parseJSON(text_data);
init_my_tree(my_json_data); // re-initialize the tree view to load with new data
});
I'm doing this based on this link, where Ivan seems to advocate this http://groups.google.com/group/jstree/browse_thread/thread/b40a1f0ab0f9a66b?fwc=2
我是根据这个链接做的,伊万似乎提倡这个 http://groups.google.com/group/jstree/browse_thread/thread/b40a1f0ab0f9a66b?fwc=2
However, what's happening is that, on the 2nd call to init, I end up geting this error in firebug
但是,发生的事情是,在第二次调用 init 时,我最终在 firebug 中收到此错误
instance._get_settings is not a function
instance._get_settings 不是函数
I tried calling destroy
我试过调用销毁
$("#demo1").jstree("destroy");
but that didn't fix my problem.
但这并没有解决我的问题。
How can I replace the entire tree with new json data?
如何用新的 json 数据替换整个树?
采纳答案by saiena
Here's how I solved this problem: - wrap all the bindings and initialization of the tree in a function - call this function from my document.ready function (this handles initial setup of the tree) - in the success callback of my ajax call, I destroy the tree and then call the function again
这是我解决这个问题的方法: - 将树的所有绑定和初始化包装在一个函数中 - 从我的 document.ready 函数调用这个函数(它处理树的初始设置) - 在我的 ajax 调用的成功回调中,我销毁树,然后再次调用该函数
Here's the code:
这是代码:
function loadTargetTree() {
$("#target-book-tree").bind("select_node.jstree", function (e, data) {
data.rslt.obj; // the LI node that was clicked
selectedTargetID = data.rslt.obj.attr("id");
if(data.rslt.obj.hasClass("book") || data.rslt.obj.hasClass("section")) {
targetChapterIsSelected = false;
toggleCopyTools()
} else {
targetChapterIsSelected = true;
toggleCopyTools();
target_parent_id = selectedTargetID;
}
});
$("#target-book-tree")
.jstree({
core : {
"initially_open" : ["book_"+getParameterByName('target_book_id')],
"animation": 100
},
"plugins":["themes","html_data","ui"],
"themes" : {
"theme" : "classic",
"dots" : true,
"icons" : false
},
"ui" : {
"select_limit" : 1,
"selected_parent_close" : "deselect",
},
});
}
$(document).ready(function() {
loadTargetTree();
});
AND MY AJAX CALL:
var sendData = 'new_name='+$('input#new_name').val()+'&target_book_id='+target_book_id + '&source_lib_id='+source_lib_id + '&target_parent_id='+target_parent_id;
$.ajax({
dataType: "json",
type: "POST",
url: "/ajax/CopySelectedSection",
data: sendData,
error: function(data) {
alert("Oops! An error occured. Please try again later.")
},
success: function(data) {
if (data['status'] == "ok") {
$("div#target-book-tree").html(data['book_outline']);
$("#target-book-tree").jstree('destroy');
loadTargetTree();
} else {
alert("Sorry, ...");
}
}
})
回答by povisenko
I had the same problem. Version jsTree - 3.0.*. A have solved it in the next way:
我有同样的问题。版本 jsTree - 3.0.*。A 已经通过下一个方式解决了它:
$(function (){
var data = JSON.parse('<?php echo $treedata;?>');
initTree(data);
var data1 = JSON.parse('<?php echo $terminsData;?>');
var flag = 0;
$("#butree").on("click", function () {
if (flag) {
$("#termtree").jstree("destroy");
initTree(data);
flag = 0;
} else {
$("#termtree").jstree("destroy");
initTree(data1);
flag = 1;
}
});
});