मैं एक रीढ़ की हड्डी के दृश्य में डी 3 का उपयोग कर एक ग्राफ visuzalization पर काम कर रहा हूँ। मैं उपयोगकर्ता को ग्राफ को चुटकी-ज़ूम करने की अनुमति देता हूं, वेबकिट ट्रांसफॉर्म का उपयोग करके आसानी से संक्रमण कर रहा हूं, और रिलीज पर फिर से चल रहा हूं। कोड को सरल रखने के लिए, मैं तत्वों के लिए नई स्थिति और आकारों का पुनर्मूल्यांकन करने के बजाय, नए पैमाने पर ग्राफ को फिर से तैयार कर रहा हूं (यह मेरा मूल दृष्टिकोण था, लेकिन मेरी टीम ने रेड्रा रूट का अनुरोध किया था)।डीओएम नोड क्लीनअप डी 3 में कैसे काम करता है?
[मैंने ट्विटर के माध्यम से Bostock के साथ बात की। यह वास्तव में चीजों को करने का पसंदीदा तरीका नहीं है]
जो चीज़ मैं देख रहा हूं वह यह है कि प्रत्येक रेड्रा के लिए, मैं बहुत से डोम नोड्स को डंप कर रहा हूं जो साफ़ नहीं होते हैं।
यह ईवेंट हैंडलर/क्लोजर के भीतर परिपत्र संदर्भ से संबंधित नहीं है, क्योंकि मैंने अपने लेबल के अलावा सभी को अक्षम कर दिया है (इन्हें कोई हैंडलर संलग्न नहीं है), और वही व्यवहार होता है।
मैंने ग्राफ से तत्वों को आक्रामक रूप से हटाने का प्रयास किया है, लेकिन डोम नोड्स अभी भी रिसाव लगते हैं।
यहां कुछ प्रासंगिक कोड है। 'रेंडर' लेबल के एक नए सेट के लिए बुलाया जाता है। ज़ूमिंग परिष्करण पर, 'करीब' पुराने ग्राफ पर कहा जाता है, और एक नया एक और दृश्य इन्स्टेन्शियशन के साथ बनाया जाता है और 'प्रस्तुत करना' करने के लिए कॉल:
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();
}
आप देखते हैं, मैं कुछ भी मुश्किल नहीं कर रहा हूँ कर सकते हैं घटना हैंडलर या बंद के साथ। कुछ ज़ूम इंटरैक्शन के साथ मैं दर्जनों डोम नोड्स को रिसाव कर सकता हूं जिन्हें कभी भी जीसी द्वारा पुनः दावा नहीं किया जाता है।
क्या यह एक स्मृति रिसाव है, या डी 3 भविष्य के ग्राफ निर्माण/अपडेट को अनुकूलित करने के लिए दृश्यों के पीछे कुछ कर रहा है? क्या ऐसे ग्राफ को नष्ट करने का कोई बेहतर तरीका है जिसे मैं नहीं जानता हूं?
कोई भी विचार?
धन्यवाद। मैं अलग-अलग ज़ूमिंग विकल्पों को देखूंगा, लेकिन कारण मैं पहले उनका उपयोग नहीं कर रहा था यह था कि मेरे ग्राफ में आयताकारों के भीतर स्थिर-फ़ॉन्ट-आकार का टेक्स्ट है, और मुझे ज़ूम इन/आउट पर किसी भी आवश्यक छंटनी को निर्धारित करने की आवश्यकता है। लेकिन फिर, सभी मदद के लिए धन्यवाद :) – Gopherkhan
हाँ, ऐसे कई कारण हैं जिनसे ज्यामितीय ज़ूमिंग अपर्याप्त है। कभी-कभी आप उन मुद्दों को पैच कर सकते हैं, ज़ूम स्तर को बढ़ाने के दौरान फ़ॉन्ट आकार को कम करके कहें, लेकिन प्रायः तत्वों को व्यवस्थित रूप से स्थानांतरित करना आसान होता है। – mbostock
मुझे पता है कि यह एक पुराना सवाल है, लेकिन डीओएम नोड क्लीनअप पर कुछ आईई-विशिष्ट नोट्स के लिए यहां देखें: http://stackoverflow.com/questions/18575452/why-do-my-svg-nodes-leak-memory-in -अर्थात – explunit