バックボーンビューでD3を使用したグラフの視覚化に取り組んでいます。ユーザーがグラフをピンチズームし、Webkitトランスフォームを使用してスムーズに移行し、リリース時に再描画できるようにします。コードを単純にするために、要素の新しい位置とサイズを再計算するのではなく、新しいスケールでグラフを再描画しています(これは私の元のアプローチでしたが、私のチームは再描画ルートを要求しました)。
[ツイッターでボストックと話した。これは実際には好ましい方法ではありません]
私が気付いているのは、再描画するたびに、クリーンアップされていない大量のdomノードをダンプしているということです。
ラベル以外のすべてを無効にしたため(これらにはハンドラーがアタッチされていないため)、これはイベントハンドラー/クロージャー内の循環参照とは関係ありません。同じ動作が発生します。
グラフから要素を積極的に削除しようとしましたが、それでもdomノードがリークしているようです。
ここにいくつかの関連するコードがあります。'render'は、新しいラベルのセットに対して呼び出されます。ズームが終了すると、古いグラフで「close」が呼び出され、別のビューのインスタンス化と「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は将来のグラフの作成/更新を最適化するために、舞台裏で何かを行っていますか?私が知らないグラフを破壊するためのより良い方法はありますか?
何か案は?