Javascript 如何完全删除d3 forceSimulation及其阻力手柄
我希望允许用户使用a或a查看其网络,这意味着当用户触发事件时,我需要更改哪些布局算法正在更新我的节点和边的Javascript 如何完全删除d3 forceSimulation及其阻力手柄,javascript,d3.js,webcola,Javascript,D3.js,Webcola,我希望允许用户使用a或a查看其网络,这意味着当用户触发事件时,我需要更改哪些布局算法正在更新我的节点和边的x和y属性 特别是,这要求我能够停止模拟,并防止它们在另一个处于“活动”状态时更新我提供给它们的数据上的那些属性,以及删除与它们关联的拖动处理程序 我的渲染函数当前具有: if (use_cola) { // MUST TURN OFF D3 AND ITS DRAG HANDLERS! force = cola_force.nodes(graph
x
和y
属性
特别是,这要求我能够停止模拟,并防止它们在另一个处于“活动”状态时更新我提供给它们的数据上的那些属性,以及删除与它们关联的拖动处理程序
我的渲染函数当前具有:
if (use_cola) {
// MUST TURN OFF D3 AND ITS DRAG HANDLERS!
force = cola_force.nodes(graph.nodes)
.links(links)
.groups(groups[group_nodes_by])
.jaccardLinkLengths(repulsion_strength, 0.7)
.avoidOverlaps(true)
.start(50, 0, 50);
node.call(cola_force.drag);
group.call(cola_force.drag);
cola_force.on('tick', ticked);
} else { // d3
// MUST TURN OFF COLA AND ITS DRAG HANDLERS!
force = d3_force.nodes(graph.nodes)
.force("link", d3.forceLink(links))
.force("charge", d3.forceManyBody().strength(-repulsion_strength))
.force("center", d3.forceCenter(w/2,h/2));
node.call(d3.drag()
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended)); // where those are the conventional functions
d3_force.on('tick', ticked);
}
一种解决方案可能是损坏这些对象,例如,delete d3\u force['something\u important']
一些更简单的方法可能会起作用,比如d3\u force.nodes([])
或类似的方法
我不确定我将如何做一些类似于拖动处理程序的事情,因为我不太熟悉它们的工作原理
更新1:
建议使用d3拖动处理程序的部分解决方案(在d3v3中):
然后在以后恢复它:
d3.selectAll('rect#no-drag').on('mousedown.drag', dragCallback);
你需要做两件事:
d3\u force.alpha(1).restart()
.drag
,因此您可以按如下方式解除拖动行为的绑定:
selection.on(".drag", null);
在您的例子中,这将是node.on(“.drag”,null)
。如果用户切换回布局,则可以再次将拖动行为绑定到节点
选择。为此,可能需要考虑预先创建拖动行为,并在稍后重新绑定时传递引用这是一个很好的答案!但这只是部分原因。我不确定我在指定上面的内容方面做得是否足够好,但我需要弄清楚如何在这两个库之间交替使用——d3和cola。您的答案显示了如何关闭d3拖动处理程序和布局,以便我可以切换到cola,但我仍然需要找出如何关闭cola拖动处理程序和布局以切换到d3。因为可乐比较稀少,也没有很好的医生,我不希望你能给我一个答案,但是你能给我指出正确的方向吗?我应该去哪里寻找可乐的拖拽处理器(类似于“.drag”)?@alexlenailimo,这相当广泛。我理解你在寻找什么,但问题是,我读到它的时候,就好像你是在单独要求D3一样。我建议你切中要害,把可乐部分放到一个新问题中,同时在两个问题中提供一个到另一篇文章的链接。因为我自己不喜欢可乐,恐怕这是我能为你做的最多的了。
selection.on(".drag", null);