हाल ही में पढ़ने वाले रोचक blog post से निकालने की प्रतिलिपि बनाना। आशा करता हूँ की ये काम करेगा।
आम रीढ़ नुकसान से बचना: नहीं unbinding घटनाओं
Backbone.js में एक आम पैटर्न देखा गया है कि मॉडल या संग्रहण में परिवर्तन पर सुनने पैदा कर रही है द्वारा मेमोरी लीक बना रहा है। यह तकनीक आम तौर पर अंतर्निहित डेटा में परिवर्तन होने पर दृश्य को स्वचालित रूप से पुनः प्रस्तुत करने की अनुमति देने के लिए होती है। इसका यह भी अर्थ है कि बड़े संग्रह के लिए हम कई विचारों (संग्रह में प्रत्येक मॉडल के लिए कम से कम एक) के साथ समाप्त हो सकते हैं कि हम डेटा में परिवर्तनों के आधार पर गतिशील रूप से बना या नष्ट कर सकते हैं।
समस्या तब उत्पन्न होती है जब हम एक दृश्य को हटाते हैं (आमतौर पर इसकी .remove() विधि को कॉल करके), लेकिन मॉडल परिवर्तनों को सुनने वाली विधियों को अनदेखा करना भूल जाते हैं। ऐसे मामले में, भले ही हमारे कोड में उस दृश्य का संदर्भ न हो, फिर भी यह कभी कचरा नहीं होता है क्योंकि मॉडल अभी भी ईवेंट हैंडलर के माध्यम से ऐसा संदर्भ रखता है।
उदाहरण के लिए इस दृश्य लें:
var SomeModelView = Backbone.View.extend({
initialize: function() {
this.model.on('change', this.render, this);
},
render: function() {
// render a template
}
});
जब .remove() विधि बुला, "परिवर्तन" ईवेंट हैंडलर (हमारे समारोह प्रस्तुत करना) अभी भी स्वाभाविक है। इसलिए जब डीओएम तत्व हटाया जा सकता है, तो दृश्य वस्तु स्वयं स्मृति से कभी जारी नहीं होती है।
यह हल करना आसान है (विशेष रूप से बैकबोन 0.9.एक्स के बाद से) - हमें केवल ईवेंट हैंडलर को बाध्य करते समय .on() का उपयोग करना बंद करना है। इसके बजाय, हम नई .listenTo() विधि, इस तरह उपयोग कर सकते हैं:
initialize: function() {
this.listenTo(this.model, 'change', this.render);
}
सबसे बड़ा अंतर यह यहाँ देखने के लिए मॉडल से जिम्मेदारी में बदलाव किया जा रहा है। इसका अर्थ यह है कि जब भी हम .remove() को कॉल करते हैं, तो दृश्य स्वचालित रूप से इस सामान्य रिसाव को ठीक करने के लिए .listenTo() विधि का उपयोग करके किसी भी घटना को बाध्य कर देगा।
[इस प्रश्न] में कुछ संबंधित चर्चा (http://stackoverflow.com/questions/14041042/backbone-0-9-9- डिफरेंस-between-listento-and-on) – explunit