これは説明するのが難しいですが、答えが簡単であることを願っています...我慢してください... jsをいじることを考えましたが、使用するデータは内部サーバーからのものであるため、多くのコードを書き直す必要があります。
私はネットワーク マップをモデル化するために大量の js を作成しましたが、これは長すぎます。問題の本質は、初期データを使用してマップをうまく描画できることですが、マップを更新すると、つまり、ノードを削除するときに破損することがあります。元のマップ (ただし、新しいノードを追加することはできます)
問題は、svg オブジェクトの描画方法にあると思います。
私はその場でd3を少し動かそうとしているので、意図せずに正しいことから逸脱した可能性があります。
まず、vis を定義します (現在は window.vis なので、コンソールでテストできます)。いくつかの例では、変数 svg を使用していると思います。
window.vis = d3.select("body")
.append("svg:svg")
.attr("pointer-events", "all")
.append('svg:g')
.call(d3.behavior.zoom().on("zoom", redraw))
.append('svg:g');
次に、nodeArray (必要なノードの配列) と linkArray (必要なリンクの配列) を作成し、ノードとリンクを描画します。
link = vis.selectAll("line").data(linkArray);
link.enter().append("line")
.attr("stroke-opacity", function (d, i) {
if (d.class == 'link reallink') {
return '0.8';
} else {
return '0';
};
})
.attr("stroke-width", function (d, i) {
if (d.class == 'link reallink') {
return '3';
} else {
return '0';
};
})
.style("stroke", function (d, i) { return d.color; });
node = vis.selectAll("g.node").data(nodeArray);
node.enter().append("svg:g")
.attr("class", function (d) { return d.class })
.attr("id", function (d) { return d.id })
.call(force.drag);
//append to each node an svg circle element
vis.selectAll(".realnode").append("svg:circle")
.attr("r", function (d, i) {
if (d.status != "0") {
return r*2;
} else {
if (d.iconimage == "") { return r; } else { return 1; }
}
})
.style("fill", function (d, i) { if (d.status != "0") { if (d.status == "1") { return "#ff0000"; } else { return "#FFBF00"; } } else { return "#FFFFFF"; }})
.style("stroke", function (d) {
if (d.style !== 'filled') { return d.color; };
})
.style("stroke-width", "4");
//attach images to the nodes
vis.selectAll(".realnode").append("image")
.attr("xlink:href", function (d) { return d.iconimage; })
.attr("x", -16)
.attr("y", -16)
.attr("width", 32)
.attr("height", 32);
注: 私が使用するノード クラスは node (すべてのノード) と realnode (実際のオブジェクト) です (後で別のクラス labelnode としてテキスト ラベルもモデル化するため)。nodeArray はノードとしてフォーマットされたオブジェクトの単なる配列であり、linkArray は単なるリンクの配列です。
「リンク」と「ノード」を定義していることがわかります-すべての例とほぼ同じです-しかし、node.selectAll(".realnode").append を使用すると、円と画像が適切に追加されないことがわかりました...しかしvis.selectAll(".realnode").append... を使用すると正常に動作するので、それを実行して先に進みました
しかし、私はこの理解不足を解決する必要があると思います!
後で nodeArray からノードを削除し、linkArray からリンクを削除して表示を更新すると、再び「ノード」オブジェクトと「リンク」オブジェクトを「vis」と無計画に組み合わせて使用します。その時点ですべてがうまくいかず、破損します。ページの svg 要素にはまだ適切なオブジェクトが定義されていますが、画像が入れ替わり、テキストが入れ替わり、リンクがノードなしで自然に浮かんでいます! nodeArray と linkArray を確認しましたが、それらは完全に正しいものでした。更新後に「新しい」データを元のデータとして使用すると、ページを最初にロードしたときに正常にレンダリングされるため、データ オブジェクトにかなり自信があります。
誰かがこれを見て、私が間違っていることを理解してくれることを願っているので、質問に答えて、これを更新するのが最善の方法だと思います。本当に厄介なことは、最初のページの読み込みは常に完全に機能しますが、最初のページ全体のコードをゼロから描画するよりもデータの更新に時間がかかることです!
ありがとう
――クリス