2013-03-26 14 views
14

जहां तक ​​मैं कहने में सक्षम हूं, listenTo और stopListening क्रमशः on और off को प्रतिस्थापित करना चाहिए। क्या मैं सही ढंग से समझता हूँ? क्या कोई ऐसी स्थिति है जहां on/off का उपयोग listenTo/stopListening के बजाय किया जाना चाहिए?क्या सभी बैकबोन चालू/बंद घटनाओं को सुनना/बंद करना बंद कर दिया जाना चाहिए?

संपादित करें:

मैं अपने कोड refactor करने के लिए चला गया के रूप में, यह स्पष्ट onlistenTo से अधिक के लिए कुछ मामलों देखते हैं कि बन गया। documentation बहुत स्पष्ट है जब एक वस्तु किसी अन्य वस्तु को सुनता है के लिए यह है कि:

एक वस्तु बताओ एक अन्य वस्तु पर एक विशेष घटना को सुनने के लिए।

इसलिए

, जब एक collection या model पर ही एक घटना के लिए सुन रहा है, हम on बजाय listenTo उपयोग करना चाहिए।

मैं यह सही ...

सरल नियम का पालन करने के लिए है यह मानते हुए है इस:

उपयोग listenTo जब किसी अन्य वस्तु पर घटनाओं के लिए सुन रहा। स्वयं पर घटनाओं को सुनते समय on का उपयोग करें।

+0

[इस प्रश्न] में कुछ संबंधित चर्चा (http://stackoverflow.com/questions/14041042/backbone-0-9-9- डिफरेंस-between-listento-and-on) – explunit

उत्तर

10

अधिकांश भाग के लिए, आप इसे सही ढंग से समझते हैं। यहां उनके गितब भंडार से इस मामले पर चर्चा है: https://github.com/documentcloud/backbone/issues/1923#issuecomment-11462852

listenTo और stopListening राज्य का ट्रैक रखें। यह थोड़ा कोड ओवरहेड की कीमत पर आपके लिए सफाई का ख्याल रखेगा। लगभग हर मामले में मैं सोच सकता हूं कि आप अपने विचारों के लिए यह व्यवहार चाहते हैं, लेकिन आप स्वयं को कॉल को चालू/बंद करने के लिए गलती नहीं करेंगे; वे जल्द ही on और off को बहिष्कृत नहीं करेंगे।

+0

'ऑन' का उपयोग जारी रखने का एक कारण 'अगर आप ईवेंट हैंडलर ट्रिगर होने पर' व्यू 'के अलावा कोई संदर्भ सेट करना चाहते हैं। 'listenTo' का कोई संदर्भ तर्क नहीं है, क्योंकि यह मानता है कि आप संदर्भ को 'व्यू' होना चाहते हैं जो सुन रहा है। – machineghost

14

हाल ही में पढ़ने वाले रोचक 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() विधि का उपयोग करके किसी भी घटना को बाध्य कर देगा।

+2

अच्छा सारांश है कि अब 'listenTo' क्यों है। – Bart

+0

ग्रेट सारांश :) – Andru

+0

बैरबोन के लिए लाइब्रेरी मेरियनेट, इन प्रकार की मेमोरी लीक को रोकने के लिए मेमोरी मैनेजमेंट (ज़ोंबी व्यू इत्यादि को मारना ...) में बनाया गया है। http://marionettejs.com/ –

संबंधित मुद्दे