首先向所有人道歉,为我的上一个问题(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')进行交互。
令人讨厌的是,小提琴在初次抽奖时工作正常。这是两次破坏的更新。
有什么建议吗?
由于
- 克里斯
答案 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/