2016-11-10 1 views
-1

私はd3フォースレイアウトのグラフで作業しています.thisのように見えます。 私が望むのは、ルートノードをドラッグできないように修正することです。d3フォースレイアウトでドラッグ可能なノード(ルート)ノートを1つだけ設定してください

"fixed": true 

を追加してjsonファイルのルートノードを修正しましたが、引き続きドラッグ可能です。私の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

関連する問題