2015-02-24 97 views
0

我工作的一个简单的D3力导向布局的基础上,Modifying a Force Layout例如,使用setTimeout回调的正常工作,采用更新的硬编码的数据:修改强制布局 - 使用索引,而不是引用给类型错误

enter image description here

然而,我将被动态地从服务器作为JSON加载数据,所以想进入nodes阵列链路sourcetarget被指定为索引,而不是实际的JavaScript节点对象的引用。该选项在documentation中描述;

注意:源和目标属性的值最初可以是 指定为节点数组中的索引;这些将在拨打电话后被替换为 引用。

作为第一步,我尝试修改示例以使用索引;在下面的代码片段:

var a = {id: "a"}, b = {id: "b"}, c = {id: "c"}; 
nodes.push(a, b, c); 
links.push({source: a, target: b},{source: a, target: c},{source: b, target: c}); 
start(); // joins the data, (re)starts the d3.layout.force 

我改变只是一个单一的线使用索引到的节点如下:

links.push({source: 0, target: 1},{source: 0, target: 2},{source: 1, target: 2}); 

然而,这会导致JavaScript错误从d3.v3.min.js(火狐35.0.1) :

TypeError: u is undefined 

和图形仅部分创建的 - 所有3个节点被示出,但只有一个链接:

enter image description here

是否可以以这种方式使用索引?

+0

你想要的是肯定可能的。请参阅http://jsdatav.is/visuals.html?id=11550728。不知道你是如何触发布局。你只是在运行一个勾号? – 2015-02-24 16:57:12

+0

我以正常的方式将'tick'函数绑定到'd3.layout.force',如http://bl.ocks.org/mbostock/1095795所示,所以有多个ticks,图形是动画,即使它创建不正确。 – DNA 2015-02-24 17:00:58

+0

我错过了开始布局后更改数据的事实。拉斯是对的;你不能那样做。 – 2015-02-24 17:58:41

回答

3

没有,以这种方式使用指标是不可能与当前执行力布局。当您开始布局时,链接中的所有索引将被对象引用所替代(这就是文档说您可以使用索引的原因,请参阅the source的第223-229行)。如果您在没有(重新)启动布局的情况下推入索引,则此替换不会发生,并且代码会中断。

你有两个选择,使这项工作 - 无论是推引用节点的对象,或在每推后力布局打电话.start()。请注意,对于后者,您还应该在推送前停止布局,并且所有力量都将重新初始化,使得布局在每次改变时都非常“跳跃”。

这听起来像你的情况推引用Node对象,而不是指数将不会是一个问题,虽然,因为你可以访问节点的阵列。所有你需要做的就是在D3中进行索引。

+0

原始代码已在每次push()后调用'start()' - 这在[原始示例](http://bl.ocks.org/mbostock/1095795)中显示,但我会更新问题使这更明显。 – DNA 2015-02-24 17:17:41

+0

是的,但它在更改链接之前并未停止布局 - 数据已被修改但布局尚未重新启动时发生错误。 – 2015-02-24 17:21:16

+0

好的,我在每个setTimeout回调的开始处添加了'force.stop()',用于修改链接 - 但我遇到了完全相同的问题。 – DNA 2015-02-24 17:29:05

相关问题