How to delete and redraw tree layout

on something similar to your treeview sample, what is proper way to delete and redraw the tree?
I am getting the tree twice when I re-call the init code. Thanks for your help:

  var tree = {
myDiagram: null,
nodeDataArray : null,
init:function () {
//if (window.goSamples) goSamples();  // init for these samples -- you don't need to call this
var $ = go.GraphObject.make;  // for conciseness in defining templates

tree.myDiagram =
  $(go.Diagram, "treeDiv",
    {
      allowMove: false,
      allowCopy: false,
      allowDelete: false,
      allowHorizontalScroll: false,
      maxSelectionCount: 1,
      layout:
        $(go.TreeLayout,
          {
            alignment: go.TreeLayout.AlignmentStart,
            angle: 0,
            compaction: go.TreeLayout.CompactionNone,
            layerSpacing: 16,
            layerSpacingParentOverlap: 1,
            nodeIndent: 2,
            nodeIndentPastParent: 0.88,
            nodeSpacing: 0,
            setsPortSpot: false,
            setsChildPortSpot: false
          })
  });

tree.myDiagram.nodeTemplate =
  $(go.Node,
    { // no Adornment: instead change panel background color by binding to Node.isSelected
      selectionAdorned: false,
      isTreeExpanded: false,
      // a custom function to allow expanding/collapsing on double-click
      // this uses similar logic to a TreeExpanderButton
      doubleClick: function(e, node) {
        var cmd = tree.myDiagram.commandHandler;
        if (node.isTreeExpanded) {
          if (!cmd.canCollapseTree(node)) return;
        } else {
          if (!cmd.canExpandTree(node)) return;
        }
        e.handled = true;
        if (node.isTreeExpanded) {
          cmd.collapseTree(node);
        } else {
          cmd.expandTree(node);
        }
      }
    },
    $("TreeExpanderButton",
      {
        width: 14,
        "ButtonBorder.fill": "whitesmoke",
        "ButtonBorder.stroke": null,
        "_buttonFillOver": "rgba(0,128,255,0.25)",
        "_buttonStrokeOver": null
      }),
    $(go.Panel, "Horizontal",
      { position: new go.Point(16, 0) },
      new go.Binding("background", "isSelected", function (s) { return (s ? "lightblue" : "white"); }).ofObject(),
      $(go.Picture,
        {
          width: 18, height: 18,
          margin: new go.Margin(0, 4, 0, 0),
          imageStretch: go.GraphObject.Uniform
        },
        // bind the picture source on two properties of the Node
        // to display open folder, closed folder, or document
        new go.Binding("source", "isTreeExpanded", tree.imageConverter).ofObject(),
        new go.Binding("source", "isTreeLeaf", tree.imageConverter).ofObject()),
      $(go.TextBlock,
        { font: '9pt Verdana, sans-serif' },
        new go.Binding("text", "title", function(s) { return s; }))
    ),  // end Horizontal Panel
  {
    toolTip:  // define a tooltip for each node that displays the color as text
      $(go.Adornment, "Auto",
        $(go.Shape, { fill: "#FFFFCC" }),
        $(go.TextBlock, { margin: 4, maxSize: new go.Size(300,80), wrap: go.TextBlock.WrapFit },
          new go.Binding("text", "title", function(s) {return s;}))
      )  // end of Adornment
  }
  );  // end Node

// without lines
tree.myDiagram.linkTemplate = $(go.Link);

// // with lines
// myDiagram.linkTemplate =
//   $(go.Link,
//     { selectable: false,
//       routing: go.Link.Orthogonal,
//       fromEndSegmentLength: 4,
//       toEndSegmentLength: 4,
//       fromSpot: new go.Spot(0.001, 1, 7, 0),
//       toSpot: go.Spot.Left },
//     $(go.Shape,
//       { stroke: 'gray', strokeDashArray: [1,2] }));


if (false) {
  // create a random tree
  //tree.nodeDataArray = [{ key: 0 }];
  var max = 30;
  var count = 0;
  while (count < max) {
    count = tree.makeTree(3, count, max, tree.nodeDataArray, tree.nodeDataArray[0]);
  }
 }
 // tree.myDiagram.model = new go.TreeModel(nodeDataArray);
 },

loadTreeArray: function(jsonObj) {
var arr = jsonObj.TargetsTree;
if (!arr) {
  alert('Cannot find array of tree data.');
  return false;
} else {
  if (tree.nodeDataArray) {
    tree.nodeDataArray.length = 0; // this clears the array.
  }
  tree.nodeDataArray = new Array();
  var i = 0;
  var len = arr.length;
  while (i < len) {
    var obj = arr[i];
    console.log('json: key: ' + obj.key + ' parent: ' + obj.parent + ' code: ' + obj.code   + ' title: ' + obj.title);
    tree.nodeDataArray.push(obj);
    i++;
  }
}
return true;
},
drawTree: function() {
tree.myDiagram.model = new go.TreeModel(tree.nodeDataArray);
 },
 selectedCode:function() {
 // assumes only 1 selected.
 // (tree.myDiagram.selection.each(function(part) {if (part instanceof go.Node) {return('selected ' + 
 part.data.key);}}));
 // or tree.myDiagram.iterator.each(function(part) {if (part instanceof go.Node) {console.log('selected ' + 
 part.data.key);}});
  var it = tree.myDiagram.selection.iterator;
  while (it.next()) {
  var part = it.value;
  var code = part.data.code;
  return code;
  }
 return null;
 },
selectedTitle:function() {
 // assumes only 1 selected.
 // (tree.myDiagram.selection.each(function(part) {if (part instanceof go.Node) {return('selected ' + 
part.data.key);}}));
// or tree.myDiagram.iterator.each(function(part) {if (part instanceof go.Node) {console.log('selected ' + 
part.data.key);}});
var it = tree.myDiagram.selection.iterator;
while (it.next()) {
  var part = it.value;
  var ttl = part.data.title;
  return ttl;
}
return null;
},
numSelected: function() {
return tree.myDiagram.selection.iterator.count;
},
makeTree:function (level, count, max, nodeDataArray, parentdata) {
var numchildren = Math.floor(Math.random() * 10);
for (var i = 0; i < numchildren; i++) {
  if (count >= max) return count;
  count++;
  var childdata = { key: count, parent: parentdata.key , code: 'code for ' + count};
  nodeDataArray.push(childdata);
  if (level > 0 && Math.random() > 0.5) {
    count = tree.makeTree(level - 1, count, max, nodeDataArray, childdata);
  }
}
return count;
},

// takes a property change on either isTreeLeaf or isTreeExpanded and selects the correct image to use
imageConverter:function (prop, picture) {
var node = picture.part;
if (node.isTreeLeaf) {
  return "/gojs/samples/images/document.png";
} else {
  if (node.isTreeExpanded) {
    return "/gojs/samples/images/openFolder.png";
  } else {
    return "/gojs/samples/images/closedFolder.png";
  }
 }
}
};

The most common thing to do is to replace the Diagram.model with a new instance of a subclass of Model. That’s what you see in many of the samples which have save and load functions that are called from HTML Buttons.

Sorry, but can you point me to one. It’s not apparent from the many links you have to samples, which have save/load. thanks!

isn’t that what I am doing when I re-call this?

tree.myDiagram.model = new go.TreeModel(tree.nodeDataArray);

it is drawing it again.

That’s what search is for. I think there’s at least 30 samples that let the user save and load to the <textarea> on the page. But here’s one for you: State Chart

Yes, that should discard the old diagram and build a new one from the model data.

I see it, but
it was still drawing the tree when I reassigned the model.
I had to do this first to get the old one to go away:
tree.myDiagram.model = new go.TreeModel();
tree.myDiagram.model = new go.TreeModel(tree.nodeDataArray);
Seems to be working now. Thanks!