3

我在 d3 中使用强制导向布局,但在开发中遇到了一些障碍。

    var circle = svg.append("svg:g").selectAll("circle") 
     .data(force.nodes()) 
   .enter().append("svg:circle")   
     .attr("r", function( d ) { 
      return d.fValue; 
     }) 
     .style('fill', function( d ) { 
       return strokeColor( d.name );   
     })
     .call(force.drag);

基本上,我想向 force.drag 定义的“拖动”行为添加更多事件侦听器 - 即,我想确保节点在拖动时改变颜色(而不是在鼠标悬停时)。我能想到的唯一两种方法是以某种方式更改 force.drag 函数或定义新的拖动行为。

我不知道第一种方法是怎么做的,但是当我尝试第二种方法时,方法链接只会接受第二个拖动事件,而忽略第一个 force.drag 事件。

.call(customDrag)
.call(force.drag); // This would work

如何附加另一个拖动事件侦听器或修改现有 force.drag 以适应我要添加的新动画?

提前致谢

4

1 回答 1

4

定义你自己的监听器,force.drag只调用force.tick()afaik:

  var node_drag = d3.behavior.drag()
        .on("dragstart", dragstart)
        .on("drag", dragmove)
        .on("dragend", dragend);
  vis.selectAll("g.node").call(node_drag)

那么只要确保你打电话给你tick()dragmove

我这样做是为了通过强制布局添加拖放支持。 请参阅我的 stackoverflow 问题和答案以获取示例

于 2012-08-08T14:59:32.933 回答