D3のうち4つを使用しているときにノードとそのすべての子を完全に更新するには、以下のスニペットを調整するのに少し問題があります。D3 v4ツリーノードを新しい親にドラッグする
このコードは、ノードがドラッグされて別の親ノードにドロップされると(「dragend」イベント時に)起動します。ドラッグされたノードを現在の親ノードから削除し、新しい親の子ノードに挿入するのが目的です。
現在のコードは、v4を使用するときに意図したとおりの動作をしますが、新しいバージョンでは「draggingNode」に更新する必要があるようです。ポジション。最低でも、「draggingNode」を新しい「親」に適用する必要があります。また、新しい位置がツリー内にある場所に「深さ」を更新します。 「draggingNode」の各子もツリー内の新しい位置に「深さ」を更新する必要があります。
- selectedNodeの:ノード "draggingNodeが"(新しい親)にドロップされた
- draggingNode:
:ノードが現在var index = draggingNode.parent.children.indexOf(draggingNode); if (index > -1) { draggingNode.parent.children.splice(index, 1); // had to update the "draggingNode" parent "children" array if it's // empty otherwise the "firstWalk()" core function throws an error when // trying to call "children[0]". if (draggingNode.parent.children.length == 0) { draggingNode.parent.children = null; } } if (typeof selectedNode.children !== 'undefined' || typeof selectedNode._children !== 'undefined') { if (typeof selectedNode.children !== 'undefined') { selectedNode.children.push(draggingNode); } else { selectedNode._children.push(draggingNode); } } else { selectedNode.children = []; selectedNode.children.push(draggingNode); }
ターゲットスニペットを(full source code)ドラッグされています
私は上記のコードは変わらないと思っていますが、私はそれが正しく更新することができるように "draggingNode"のいくつかの更新を追加する必要があります。
私の最初の考えは単純に「selectedNodeの」アレイにそれを追加する前に、上記のスニペットに以下を追加しました:
draggingNode.parent = selectedNode;
draggingNode.depth = selectedNode.depth + 1;
これは素晴らしい作品!問題は、子なしのノードでのみ機能することです。子ノードのプロパティを更新する必要があります。
QUESTIONは、そのプロパティが適切に彼らの新しい両親や深さに調整されるように、どのように私は、「draggingNode」を更新し、そのすべての子ができ
IS?
hierarchyまたはstratifyのように使用して正しく更新できる機能はありますか?もしそうなら、私はそれらの仕事をどうやって作るのかについてはあまりよく分かりません。 API内で利用可能な機能がない場合、すべての子をループして深みを更新するだけです。
ありがとうございます、私はあなたの提案を受け取りました。これまでのところ、これはあらゆる種類のツリーモッズでうまくいきます。 – timmacp