这个问题是对前一个标题为“初始化图形后的D3-Force更新参数”(D3-Force updating parameters after initializing graph)和@altocumulus回答的后续问题的跟进。
我试图在修改某些节点的半径后更新模拟力。但是,当我呼吁forceCollide
考虑更改时,它无效。
图表首先正确启动,使用var forceCollide = d3.forceCollide()
.radius(function(d){return d.radius;})
.iterations(2)
.strength(0.95);
var simulation = d3.forceSimulation()
.velocityDecay(velocityDecay)
.force("collide", forceCollide);
和一个函数使力与半径相对应:
d.radius
然后,我修改了forceCollide
对象,并希望forceCollide
反映更改。但是,当我再次呼叫forceCollide.radius(function(d){
d.radius;})
时,它不起作用:
$(document).ready(function() {
var array = $(".chip")
.clone() //clone the element
.children() //select all the children
.remove() //remove all the children
.end() //again go back to selected element
.text(); ;
alert(array);
});
有关为何发生这种情况的任何想法?
答案 0 :(得分:5)
这实际上不会更新半径。您只是重新设置用于确定半径的回调,与之前相比,它甚至没有变化。即使它做了更改,也不会触发您的更新,因为根据您更新的数据不能重新评估半径。
更新链接力的距离回调时,力本身将被初始化。查看source会显示对initializeDistance()
的调用:
force.distance = function(_) {
return arguments.length ? (distance = typeof _ === "function" ? _ : constant(+_), initializeDistance(), force) : distance;
};
对于其他力量的许多其他更新也是如此。参数。
然而,查看collide力的来源,注意到没有调用初始化:
force.radius = function(_) {
return arguments.length ? (radius = typeof _ === "function" ? _ : constant(+_), force) : radius;
};
由于您的回调无法更改,因此您无需再次致电forceCollide.radius()
。相反,你需要打电话
forceCollide.initialize(simulation.nodes());
这将根据您更新的数据重新评估半径。