更新D3强制布局 - 添加和删除节点会破坏页面

时间:2013-05-23 16:02:36

标签: javascript svg d3.js

首先向所有人道歉,为我的上一个问题(D3: problems with node = vis.selectAll(".node"))有效地打开一个重复的问题,但最初我认为我可以这样做,但它从来没有真正起作用。

这两个问题是相同的,所以在此之前可能值得阅读另一个问题。

我遇到的问题是用新节点更新力布局。实际上,我每隔几秒就有一次ajax调用以获取更新的数据,我有大量的代码来解析它并找出更改的内容,并通过节点数组(创造性地称为nodeArray)添加新节点以及指向链接的新链接数组(称为linkArray)。我还将文本标签作为节点(也在nodeArray中)与linkArray中各自节点的链接混淆了一些东西。

这一次,我没有尝试描述这个问题,而是创造了两个几乎相同的小提琴:

a)添加一个节点 - 这个小提琴解析原始数据,然后在5秒后添加一个节点。 (http://jsfiddle.net/zuzzy/dFd3H/2/

b)删除一个节点 - 这个小提琴解析原始数据,然后在5秒后删除一个节点。 (http://jsfiddle.net/zuzzy/wqS3G/1/

只需查看代码的以下部分:

setTimeout(function () {
//update the objects

...

},5000);

//----- functions for drawing and tick below

function draw() {

....

}

我遇到的问题是我接近这个问题的复杂方式。我可以找到的所有示例都使用我使用过的概念(如文本标签节点)进行静态布局,或者它们是动态的,但它们只使用带圆圈的简单节点。我实际上比它更难让它变得更难,因为我不仅使用圆圈和文字标签,而且还在圆圈上覆盖了一个图像......但这对于小提琴示例来说太复杂了。所以这些小提琴是我的代码的摘录(这也需要内联网页面,所以无论如何都不能在jsfiddle上工作)所​​以如果它看起来很复杂和做作,请道歉。

我知道我做错了,我怀疑(希望?)问题的答案在两个小提琴中都是一样的。

我也期望问题存在于draw()函数中 - 这就是我觉得问题应该是因为而不是遵循正常的'创建一个节点对象,并与那个'进行交互。公式I直接与svg对象(' vis')进行交互。

令人讨厌的是,小提琴在初次抽奖时工作正常。这是两次破坏的更新。

有什么建议吗?

由于

- 克里斯

1 个答案:

答案 0 :(得分:1)

我经过很多比赛后自己都回答了。我在小提琴中修复了一个相当大的拼写错误,但是我没有帮助添加小提琴,因为我从for循环中复制了一些文本而没有替换循环中的变量(在setInterval中,我将节点添加到数组)

node_hash[key] = a;

更改为

node_hash["REMOTE"] = a;

实际上这不是问题,并没有影响删除小提琴。我仍然不确定为什么它之前没有工作只是引用'vis',但我重新设计了小提琴,现在他们添加和删除罚款。

添加的固定小提琴是http://jsfiddle.net/zuzzy/fmkC5/5/

删除的固定小提琴是http://jsfiddle.net/zuzzy/wqS3G/3/