2012-02-21 16 views
14

अगर मैं window.myView चर में दृश्य की दुकान है, यह प्रस्तुत करना है, तो JavaScript कंसोल में कहते हैं:क्यों एचटीएमएल की जगह पर बैकबोन घटनाएं काम नहीं करतीं?

$('#container').html('') 

और फिर कहते हैं:

$('#container').html(window.myView.$el) 

बाउंड घटनाओं काम करना बंद कर देगा।

मैं बहुत यकीन है कि इतना माना जाता है, लेकिन:

  • क्यों वास्तव में यह इस तरह से काम करता है?
  • ईवेंट बाइंडिंग खोने के दृश्य के उप-भाग को फिर से प्रस्तुत करने के लिए कैसे?
  • क्यों myView.render() कॉलिंग ईवेंट बाइंडिंग खोना नहीं होगा?

अद्यतन:

मिले this लेख। क्या यही कारण है?

सुनिश्चित करें jQuery अपने घटनाओं उतारने नहीं है जब आप नहीं है यह

करना चाहते हैं आप जहां मक्खी पर दृश्य बनाने और देते हैं/उन्हें डोम को हटाने किसी ऐप का निर्माण कर रहे हैं, तो आप, एक समस्या हो सकती है। जब भी आप डोम से एक दृश्य हटाते हैं, jQuery सभी घटनाओं को अनलोड करता है। तो आपके पास एक दृश्य का संदर्भ नहीं हो सकता है और इसे डोम से हटाया जा सकता है और फिर इसे बाद में फिर से संलग्न कर सकता है। आपके सभी कार्यक्रमों को अनलोड किया गया होगा। यदि आप विचारों को चारों ओर रखना चाहते हैं, तो प्रदर्शन का उपयोग करके उन्हें छिपाना बेहतर विचार है: कोई भी नहीं। हालांकि, आपको इसका दुरुपयोग नहीं करना चाहिए और उन विचारों को रीसायकल करना चाहिए जिन्हें आप थोड़ी देर के लिए उपयोग नहीं करेंगे (और मेमोरी लीक को रोकें)।

+0

साफ़ करने के लिए मेमोरी लीक का कारण बन सकता है इस प्रश्न के लिए धन्यवाद। मुझे स्पाइन के साथ एक ही समस्या थी और यह पता नहीं लगा सका कि क्या हो रहा था। –

उत्तर

18

jQuery empty, html और remove घटनाओं मेमोरी लीक रोकने के लिए सभी jQuery घटना और डेटा बाइंडिंग की सफाई कर रहे हैं (आप cleanData विधि के लिए jQuery स्रोत कोड की जांच बाहर और अधिक समझ कर सकते हैं - यह एक गैर-दस्तावेजी विधि है)

view.render() घटनाओं को नहीं हटाता है क्योंकि बैकबोन दृश्य घटनाएं ईवेंट प्रतिनिधिमंडल का उपयोग करके बाध्य होती हैं और दृश्य के el पर सीधे इसके दृश्य में तत्वों के लिए बाध्य होती हैं।

यदि आप अपने विचारों का पुन: उपयोग करना चाहते हैं तो आप उन्हें jQuery detach विधि का उपयोग करके हटा सकते हैं जो सभी घटनाओं और डेटा को बाध्य रखता है, हालांकि आपको इस तरह मेमोरी लीक का उत्पादन न करने के लिए देखना है। (jquery detach docs)

यदि आप पहली बार जाना चाहते हैं तो आप हमेशा बैकबोन का उपयोग करके बैकबोन घटनाओं को आसानी से पुनर्निर्मित कर सकते हैं। delegateEvents विधि देखें। (backbone doc)

ps। यह भी क्लीनर और jQuery .empty() का उपयोग करने के लिए अधिक अनुकूल है, इसके बजाय .html('') के रूप में jQuery एचटीएमएल विधि हमेशा नए एचटीएमएल डालने से पहले सभी घटनाओं और डेटा को साफ करने के लिए पहले खाली कॉल करता है। JQuery और देशी डोम आंतरिक HTML को कभी भी मिश्रण न करें क्योंकि यह jQuery घटनाओं/डेटा

+1

इसे कॉल करना।प्रतिनिधि में इवेंट्स() 'एक आकर्षण की तरह काम किया। धन्यवाद। –

+0

हुरेय .delegateEvents के लिए! – SimplGy

+0

जब आप अभिभावक दृश्य प्रस्तुत करते हैं तो सभी उप-विचारों को फाड़ना और पुन: प्रयास करना भी विचार करें। –

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