I am currently having problems updating all of jstree; bootstrap of the tree works fine, and updating child nodes also work as expected, but if the data changes in the root directory of the node, the tree is not updated, even the data has been changed, and a server call has been called.
I will try to explain jstree setup.
Global variable
var levelType;
Tree setting
$("#explorer").jstree({ plugins: ["core", "ui", "themes", "json_data", "types"], themes: { theme: "default", dots: false, url: url = '@Url.Content("~/Content/jstree/default/style.css")' }, json_data: { ajax: { cache: false, url: function (node) { var nodeId = ""; var url = ""; if (node == -1) { url = '@Url.Action("GetSites", "Site")'; } else if ($(node).attr("rel") == "station") { url = '@Url.Action("GetInspections", "Inspection")' + '/' + $(node).attr("id"); } return url; }, success: function (metaData, textStatus, jqXhr) { if (levelType == null || levelType == undefined || levelType == "root") { //The initial node that is hard coded and will never change var sitesData = [{ attr: { rel: "root" }, state: "open", data: "Root Node", children: [] }]; $(metaData).each(function () { sitesData[0].children.push({ attr: { id: this.Id, rel: "station" }, state: "closed", data: this.Name }); }); return sitesData; } if (levelType == "station" || levelType == "inspection") { var items = []; $(metaData).each(function () { items.push({ attr: { id: this.Id, rel: "inspection", "class": "jstree-leaf" }, state: "closed", data: this.Name }); }); return items; } return null; } } }, types: { types: { "station": { "icon": { "image": '@Url.Content("URL")' } }, "inspection": { "icon": { "image": '@Url.Content("URL")' } }, 'loading': { 'icon': { 'image': '@Url.Content("URL")' } }, 'root': { 'icon': { 'image': '@Url.Content("URL")' } } } } });
Tree node Open event
$("#explorer").bind("before.jstree", function (e, data) { if (data.func === "open_node") { levelType = $(data.args[0]).attr("rel"); } });
This call works and updates the child nodes below the station level, as expected
var tree = jQuery.jstree._reference("#explorer"); var currentNode = tree._get_node("#the node Id"); var parent = tree._get_parent(currentNode);
THIS CALL DOES NOT WORK, but must update the whole tree
var tree = jQuery.jstree._reference("#explorer"); var currentNode = tree._get_node("#the node id"); //set the level the tree should be refreshing its data for (this is to ensure that the tree view knows it is not at a root node). var parent = tree._get_parent(currentNode); //this returns "root" levelType = $(parent).attr("rel"); tree.refresh(-1);
Hope someone can help me with this, as it drives me crazy.
Greetings