Я работаю над макетом дерева 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();
}
Почему это происходит?
Если вы не также не забудьте удалить любые связанные с ней ссылки, то я сомневаюсь, что d3 будет делать это за вас. Кроме того, чтобы быть в безопасности, убедитесь, что использование concat для дублирования массива 'nodes = tree.nodes (root) .concat(). Reverse()' - вместо того, чтобы мутировать копию макета этого массива - имеет значение. – meetamit
D3 удалит ссылки, когда они будут пересчитаны через «links = tree.links (nodes)»; а затем нарисован. Я видел это. Поскольку узлы используются для создания ссылок, дополнительные узлы отбрасывают все. Я не называю concat нигде в моем коде. Я даже установил, что мой массив узлов пуст, и дополнительные узлы все еще появляются. Я думаю, что узлы каким-то образом задерживаются внутри объекта дерева? –