私はバックボーンビューでD3を使ってグラフの視覚化に取り組んでいます。私は、ユーザーがグラフをピンチズームしたり、Webkit変換を使ってスムーズに移行したり、リリース時に再描画することを許可します。コードを単純にするために、要素の新しい位置とサイズを再計算するのではなく、新しいスケールでグラフを再描画しています(これは私の元のアプローチでしたが、私のチームは再描画ルートを要求しました)。DOMノードのクリーンアップはどのようにd3で機能しますか?
[私はBostockとTwitterで話しました。これは実際には良いことではありません]
私が気づいていることは、再描画するたびに、クリーンアップされていないドンノードをダンプすることです。
イベントハンドラ/クロージャ内の循環参照とは関係ありません。ラベル以外のすべてのラベルを無効にしています(ハンドラは添付されていません)。同様の動作が発生します。
グラフから要素を積極的に削除しようとしましたが、DOMノードがまだ漏れているようです。
ここにいくつかの関連するコードがあります。新しいラベルのセットに対して 'render'が呼び出されます。ズームが終了すると、「近くには」古いグラフに呼び出され、新しいものが別のビューのインスタンスを使用して作成し、「レンダリング」の呼び出しです:
render: function() {
// create the svg offscreen/off dom
//document.createElementNS(d3.ns.prefix.svg, "svg")
var svg = this.svg = d3.select(this.el)
.append("svg:svg")
.attr('width', this.VIEW_WIDTH)
.attr('height', this.VIEW_HEIGHT)
this._drawTimeTicks.call(this, true);
return this;
},
_drawTimeTicks: function(includeLabels) {
var bounds = this.getDayBounds();
var min = bounds.start;
var date = new Date(min);
var hour = 1000 * 60 * 60;
var hourDiff = 60 * this.SCALE;
var graphX = (date.getTime() - min)/1000/60;
var textMargin = 7;
var textVert = 11;
// Using for loop to draw multiple vertical lines
// and time labels.
var timeTicks = d3.select(this.el).select('svg');
var width = timeTicks.attr('width');
var height = timeTicks.attr('height');
for (graphX; graphX < width; graphX += hourDiff) {
timeTicks.append("svg:line")
.attr("x1", graphX)
.attr("y1", 0)
.attr("x2", graphX)
.attr("y2", height)
.classed('timeTick');
if (includeLabels) {
timeTicks.append("svg:text")
.classed("timeLabel", true)
.text(this.formatDate(date))
.attr("x", graphX + textMargin)
.attr("y", textVert);
}
date.setTime(date.getTime() + hour);
}
close: function() {
console.log("### closing the header");
this.svg.selectAll('*').remove();
this.svg.remove();
this.svg = null;
this.el.innerHTML = '';
this.unbind();
this.remove();
}
あなたが見ることができるように、私はトリッキーな何もしていませんよイベントハンドラまたはクロージャを使用します。いくつかのズームのやりとりでは、GCで再生できない数十のDOMノードが漏れてしまいます。
これはメモリーリークですか、またはd3が将来のグラフの作成/更新を最適化するための裏側で何かをしていますか?私が気づいていないグラフを破壊する良い方法がありますか?
アイデア?
ありがとうございました。私はさまざまなズームオプションを見ていきますが、私が以前に使っていなかったのは、グラフが四角形内にフォントサイズの固定されたテキストを表示していて、ズームイン/アウト時に切り捨てが必要であるということです。しかし、再び、すべての助けを感謝:) – Gopherkhan
ええ、幾何学的なズーミングが不十分である理由の多くがあります。ズームレベルを上げながらフォントサイズを小さくするなどして、問題を修正することもできますが、多くの場合、要素をプログラマチックに配置する方が簡単です。 – mbostock
これは古い質問ですが、DOMノードのクリーンアップに関するいくつかのIE特有のノートについてはこちらをご覧ください:http://stackoverflow.com/questions/18575452/why-do-my-svg-nodes-leak-memory-in 〜 – explunit