2016-11-10 132 views
-1

我正在制作一个d3 force布局图,外观很像this。 我想要的是要修复的根节点不可拖动。我通过添加在d3 force布局中只设置一个可拖动的节点(根)note

"fixed": true 

修复了根节点,但它仍然是可拖动的。在我的JS文件有代码

var nodeEnter = node.enter().append("g") 
    .attr("class", "node") 
    .on("click", click) 
    .call(force.drag); 

如果我删除此代码的最后一行,整个图形也不能拖动了。我认为'力'是一个全局变量,并且决定整个图是可拖动的。但我只希望根节点不可拖动,并且应该可拖动。我怎样才能做到这一点?

+1

你有没有一个例子?我已经在这个小提琴中测试了这个:http://jsfiddle.net/LtYnU/8/我在循环中设置了第一个固定。这工作正常吗? – thatOneGuy

+0

在您的示例中,节点不可拖动。在代码的最后一行添加.call(force.drag)。然后所有节点都可以拖动,您可以使用鼠标移动它们。我只想要根节点不可拖动,其余部分是可拖动的。这是否明确我的意思? – papapple

+0

哦,我看到了,给我第二个:) – thatOneGuy

回答

0

您必须从希望保留修复的节点中删除拖动事件。

下面是一个例子:http://jsfiddle.net/qvco2Ljy/112/

我已经通过数据环给第一元素的固定属性,也是一个donotmove属性,当你拖动作为和放手,也许你希望节点保持固定(孩子我的意思),所以在这里使用d.fixed会导致冲突:

graph.nodes.forEach(function(d, i) { 
    d.donotmove = false; 
    if (i == 0) {d.donotmove = true; d.fixed = true;} 
}) 

,并呼吁拖动事件时,请检查donotmove属性,像这样:

var drag = d3.behavior.drag() 
    .origin(function(d) { 
    return d; 
    }) 
    .on("dragstart", function(d) { 

    if (d.donotmove) return; 
    dragstarted(d) 
    }) 
    .on("drag", function(d) { 

    if (d.donotmove) return; 
    dragged(d) 
    }) 
    .on("dragend", function(d) { 

    if (d.donotmove) return; 
    dragended(d) 
    }) 

希望帮助:)

+0

我会在开始时分析数据,即循环,检查是否d.fixed == true;如果是,则将d.donotmove设置为true;然后使用该值作为检查来停止冲突 – thatOneGuy