【发布时间】:2014-03-20 09:57:34
【问题描述】:
我正在尝试创建一个 d3 力图,其中动态添加(然后删除)节点。 This example 大致完成了我想要的,但我无法适应它,因为 cmets 相当稀疏。
我的主要问题是关于start() 函数:
function start() {
link = link.data(force.links(), function(d) { return d.source.id + "-" + d.target.id; });
link.enter().insert("line", ".node").attr("class", "link");
link.exit().remove();
node = node.data(force.nodes(), function(d) { return d.id;});
node.enter().append("circle").attr("class", function(d) { return "node " + d.id; }).attr("r", 8);
node.exit().remove();
force.start();
}
首先,link = link.data(force.links(), function(d) { return d.source.id + "-" + d.target.id; }); 到底在做什么?仅制作静态布局的示例使用此样式:
link = svg.selectAll("line")
.data(links)
.enter()
.append("line")
.attr("class", "link");
该代码是否与start() 中的前两行相同? (第 4..6 行似乎更接近这种风格,所以,为什么他们使用不同的方法(insert 与 append)?)
而且,为什么第 2 行在处理链接而不是节点时引用.node?
我的最后一个问题是,像这样继续拨打force.start() 是否安全?例如,如果 start() 被调用 100 次,相隔 10 毫秒,那有关系吗?它会导致对 tick 函数的任何额外调用吗? (我只是想知道我是否应该在 start() 的顶部调用 force.stop() )? (API docs d3.layout.force 没有明确说明。)
额外问题:这些行真的有什么作用吗?
var node = svg.selectAll(".node"),
link = svg.selectAll(".link");
由于此时没有节点,它们是否等同于:
var node,link;
【问题讨论】:
标签: javascript d3.js force-layout