2012-06-11 31 views
11

मुझे अपने दृश्यों से अनइंड किए जाने के लिए पूरे close prototype क्यों बनाना चाहिए? बैकबोन बस उसमें निर्माण नहीं करना चाहिए? क्या कोई तरीका निकालने का पता लगाने का कोई तरीका है?बैकबोन घटनाएं दो बार गोलीबारी कर रही हैं

मेरी रीढ़ की हड्डी की घटनाएं दो बार आग लगती हैं जब मैं नेविगेट करता हूं और दृश्य पर वापस जाता हूं।

 events : { 
      "click #userDropdownButton > a" : "toggleUserDropdownMenu", 
      "click" : "hideUserDropdownMenuIfClickedOutside" 
     }, 

     el : "body", 

     initialize : function() { 
      this.render(); 
     }, 

     // Shows/hides the user dropdown menu 
     toggleUserDropdownMenu : function() { 
      if(!this.$el.find('#userDropdownButton > ul').is(':visible')) { 
       this.showUserDropdownMenu(); 
      } else { 
       this.hideUserDropdownMenu(); 
      } 
      return false; 
     }, 
     showUserDropdownMenu : function() { 
      this.$el.find('#userDropdownButton').addClass('hover'); 
      this.$el.find('#userDropdownButton > ul').show(); 
      this.$el.find('#userDropdownButton > a .arrow-down').removeClass('arrow-down').addClass('arrow-up'); 
     }, 
     hideUserDropdownMenuIfClickedOutside : function() { 
      if(this.$el.find('#userDropdownButton > ul').is(':visible')) { 
       this.hideUserDropdownMenu(); 
      } 
     }, 
     hideUserDropdownMenu : function() { 
      this.$el.find('#userDropdownButton').removeClass('hover'); 
      this.$el.find('#userDropdownButton > ul').hide(); 
      this.$el.find('#userDropdownButton > a .arrow-up').removeClass('arrow-up').addClass('arrow-down'); 
     }, 

पहली बार दृश्य प्रदान की गई है, लटकती खुल जाता है और ठीक से बंद कर देता है, लेकिन दूसरी बार दृश्य प्रदान की गई है पर, लटकती, के रूप में यह खुल जाता है कि हर दो बार क्लिक करें, इसलिए जितनी जल्दी की व्याख्या दूसरे क्लिक बंद यह।

+1

अगर हम जानते थे कि आप क्या कर रहे थे तो हम शायद आपको बता सकते हैं कि आप क्या कर रहे हैं। शायद अगर कुछ कोड देखने के लिए था ... –

+0

@muistooshort कोड जोड़ा गया :) प्रतिक्रिया – Garrett

+0

के लिए धन्यवाद मैं इसे http://stackoverflow.com/q/10966440/479863 का डुप्लिकेट कहूंगा या कम से कम उत्तर काफी समान है। –

उत्तर

14

अद्यतन 2013/05/01: बैकबोन 0.9.9+ जोड़ा गया है कुछ अंतर्निहित कार्यक्षमता तेह ZOMG समस्या से निपटने के लिए आसान की सुविधा के लिए (View.remove और StopListening देखें); लेकिन आपको इनमें से किसी एक को कॉल करके अभी भी अपने लाश को मारने की आवश्यकता होगी।


क्यों मैं एक पूरी करीब प्रोटोटाइप बनाने चाहिए बस अपना घटनाओं मेरे विचार से unbinded के लिए?

Derick's article इस पूरे मुद्दे को कवर करने में शानदार है। लेकिन मैं अपने दो बिट्स को जोड़ सकता हूं, "क्यों" इसका निर्माण नहीं किया गया है।

बैकबोन इवेंट प्रतिनिधिमंडल के तरीके के कारण, विचारों को कचरा नहीं दिया जाएगा जब वे दायरे से बाहर निकलते हैं घटना बाइंडिंग्स। ऐसा इसलिए है क्योंकि ऑब्जेक्ट्स जिनकी घटनाओं से वे बाध्य होते हैं - बैकबोन ऑब्जेक्ट्स, बैकबोन ऑब्जेक्ट इवेंट्स के बाध्यकारी मामले में, या "ईवेंट" कॉलबैक के मामले में DOM ईवेंट सिस्टम - दृश्य के कार्यों के संदर्भ बनाए रखते हैं।

मान लीजिए या नहीं, कुछ बैकबोन उपयोगकर्ता इस व्यवहार पर भरोसा करते हैं और उम्मीद करते हैं कि वे घटनाओं को ऑटो-प्रतिसाद देना जारी रखें, भले ही वे पूरी तरह से दायरे से बाहर हो जाएं। (मैंने ऐसा कई ट्यूटोरियल देखे हैं जो ऐसा करते हैं।) यह मानता है कि आपको कभी भी दृश्य को हटाने की आवश्यकता नहीं है, या दृश्य घटनाओं का जवाब दे सकता है और खुद को हटा सकता है, क्योंकि आपने इसका कोई संदर्भ खो दिया है, लेकिन आईएमओ, यह ' जब तक आप प्रभाव को समझते हैं तब तक कार्यक्षमता अच्छी होती है और भूल जाती है।

mu is too short यूआई घटनाओं के बारे में एक अच्छा बिंदु बनाता है। डीओएम से एल को हटाने से प्रतिनिधि कार्यक्रमों को भी हटा दिया जाना चाहिए। मॉडल या संग्रह घटनाओं या अन्य बैकबोन ऑब्जेक्ट्स ईवेंट (किसी ऑब्जेक्ट को रीढ़ की हड्डी घटनाक्रम प्रोटोटाइप का विस्तार कर सकते हैं) के लिए बाध्यकारी नहीं कहा जा सकता है। आपको उन लेखों में डरिक बेली की सलाह का पालन करना होगा जो आप लिंक करते हैं और इन मामलों में दृश्य को मैन्युअल रूप से बंद कर देते हैं। मुझे यकीन नहीं है कि यह अन्य जेएस एमवीसी ढांचे की तुलना में बैकबोन की कमजोरी है, मैंने दूसरों को गहराई से नहीं देखा है।

"क्या कोई दृश्य निकालने के दौरान पता लगाने का कोई तरीका है?"

सीधे नहीं, मुझे पता है। लेकिन आम तौर पर, जो भी कोड दृश्य को हटा रहा है, उसे ईवेंट बाइंडिंग को साफ करने के लिए भी साफ करना चाहिए। अक्सर, अच्छे एमवीसी आर्किटेक्चर में, विचार एक संबंधित मॉडल या संग्रह पर एक ईवेंट पर्यवेक्षक स्थापित कर सकते हैं, और फिर ईवेंट होने के दौरान & क्लीनअप स्वयं को हटा सकते हैं (उदा।, इसी मॉडल से "निकालें" ईवेंट)। यदि आप अपने विचारों को 'सार्वभौमिक रूप से हटाने योग्य "पहचानना चाहते हैं, तो एक तरीका है कि अपने स्वयं के व्यू प्रोटोटाइप में निकालें फ़ंक्शन को ओवरराइड करना और एक कस्टम ईवेंट ट्रिगर करना जो दूसरों द्वारा देखा जा सकता है।