2014-12-31 2 views
0

Я работаю над макетом дерева D3, и я хочу удалить один узел из родителя. У меня это работает. Я в основном вхожу в структуру данных, захватываю дочерний массив родительского узла и удаляю узел, который хочу удалить. Затем я называю «обновление», которое в значительной степени является общим обновлением, которое каждый вызывает в этих примерах.tree.nodes (root) .reverse(); возвращает слишком много узлов

var update = function() { 
    //At this point the node I removed isn't in the parent's child node array. 
    //I only remove leaf nodes. I verified that the node isn't in the root variable. 
    nodes = tree.nodes(root).reverse(); 
    //The nodes array is returned with extra, duplicate nodes. 
    //They seem to repeat based on what node is deleted. 
    links = tree.links(nodes); 
    //Links appear all over the place because of the redundant nodes. 
... 

Моя функция удаления выглядит следующим образом:

//*Only nodes without children can be deleted. 
    this.removeNode = function (node) { 
     parent = node.parent; 
     parent.children.forEach(function(child, i) { 
      if(node.name === child.name) 
      { 
       parent.children.splice(i,1); //remove the node from its parent 
      } 
      if(parent.children.length === 0) 
      { 
      parent.end = true; 
      } 
     }); 
    update(); 
} 

Почему это происходит?

+0

Если вы не также не забудьте удалить любые связанные с ней ссылки, то я сомневаюсь, что d3 будет делать это за вас. Кроме того, чтобы быть в безопасности, убедитесь, что использование concat для дублирования массива 'nodes = tree.nodes (root) .concat(). Reverse()' - вместо того, чтобы мутировать копию макета этого массива - имеет значение. – meetamit

+0

D3 удалит ссылки, когда они будут пересчитаны через «links = tree.links (nodes)»; а затем нарисован. Я видел это. Поскольку узлы используются для создания ссылок, дополнительные узлы отбрасывают все. Я не называю concat нигде в моем коде. Я даже установил, что мой массив узлов пуст, и дополнительные узлы все еще появляются. Я думаю, что узлы каким-то образом задерживаются внутри объекта дерева? –

ответ

0

Оказывается, я добавляю дочерние узлы после факта. Я использую D3 для создания многочастного дерева. Я понимаю, что для этого я мог бы использовать сетевую карту, но я нашел, что макет силы является неустойчивым и трудно укротимым. Проблема была родительским узлом, указывающим на ребенка другого родителя. Это вызвало неожиданное поведение. Чтобы создать многопартийное дерево, вам необходимо управлять дополнительными соединениями ссылок за пределами макета дерева.

http://bl.ocks.org/robschmuecker/6afc2ecb05b191359862

Смежные вопросы