jqueryjstree

Recreate entire jstree instance with new json data


I wish to replace the entire contents of a jstree tree with new json data.

I'm using jsTree 1.0 downloaded July 25, 2011 from github

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

<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

However, what's happening is that, on the 2nd call to init, I end up geting this error in firebug

instance._get_settings is not a function

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?


Solution

  • 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

    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, ...");
                    }
            }
         })