Javascript 如何完全删除d3 forceSimulation及其阻力手柄

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

我希望允许用户使用a或a查看其网络,这意味着当用户触发事件时,我需要更改哪些布局算法正在更新我的节点和边的
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);