修改强制布局 - 使用索引,而不是引用给类型错误
问题描述:
我工作的一个简单的D3力导向布局的基础上,Modifying a Force Layout例如,使用setTimeout
回调的正常工作,采用更新的硬编码的数据:修改强制布局 - 使用索引,而不是引用给类型错误
然而,我将被动态地从服务器作为JSON加载数据,所以想进入nodes
阵列链路source
和target
被指定为索引,而不是实际的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个节点被示出,但只有一个链接:
是否可以以这种方式使用索引?
答
没有,以这种方式使用指标是不可能与当前执行力布局。当您开始布局时,链接中的所有索引将被对象引用所替代(这就是文档说您可以使用索引的原因,请参阅the source的第223-229行)。如果您在没有(重新)启动布局的情况下推入索引,则此替换不会发生,并且代码会中断。
你有两个选择,使这项工作 - 无论是推引用节点的对象,或在每推后力布局打电话.start()
。请注意,对于后者,您还应该在推送前停止布局,并且所有力量都将重新初始化,使得布局在每次改变时都非常“跳跃”。
这听起来像你的情况推引用Node对象,而不是指数将不会是一个问题,虽然,因为你可以访问节点的阵列。所有你需要做的就是在D3中进行索引。
你想要的是肯定可能的。请参阅http://jsdatav.is/visuals.html?id=11550728。不知道你是如何触发布局。你只是在运行一个勾号? – 2015-02-24 16:57:12
我以正常的方式将'tick'函数绑定到'd3.layout.force',如http://bl.ocks.org/mbostock/1095795所示,所以有多个ticks,图形是动画,即使它创建不正确。 – DNA 2015-02-24 17:00:58
我错过了开始布局后更改数据的事实。拉斯是对的;你不能那样做。 – 2015-02-24 17:58:41