2017-02-27 8 views
15

के साथ जावास्क्रिप्ट में मॉड्यूलर डिज़ाइन पैटर्न का उपयोग करके मैं अब कुछ समय के लिए Modular Design Pattern का पालन कर रहा हूं और इसे बहुत उपयोगी पाया क्योंकि यह कोड & मॉड्यूल में ब्लॉक को अलग करने में मदद करता है।डीओएम चयन

jQuery साथ मॉड्यूल संरचना के नियमित उपयोग से नीचे संरचना निम्नलिखित मेरी अनुप्रयोगों/कोड के सबसे के लिए प्रेरित किया:

(function() { 
    var chat = { 
     websocket: new WebSocket("ws://echo.websocket.org/"), 
     that: this, 
     init: function() { 
      this.scrollToBottom(); 
      this.bindEvents(); 
      this.webSocketHandlers(); 
     }, 
     bindEvents: function() { 
      this.toggleChat(); 
      this.filterPeople(); 
      this.compose(); 
     }, 
     elements: { 
      indicator: $(".indicator"), 
      statusText: $(".status-text"), 
      chatHeadNames: $(".people li .name"), 
      filterInput: $("#filter-input"), 
      msgInput: $("#msg-input"), 
      sendBtn: $(".send") 
     }, 
     ... 
     ... 
     ... 
     filterPeople: function() { 
      var that = this; 
      this.elements.chatHeadNames.each(function() { 
       $(this).attr('data-search-term', $(this).text().toLowerCase()); 
      }); 
     }, 
     ... 
     ... 
     }; 

     chat.init(); 
})(); 

क्या मैं जानना चाहूंगा कि क्या के हिस्से के रूप jQuery के माध्यम से अपने सभी तत्वों को संदर्भित करती है एक एकल चर chat.elements एक अच्छा अभ्यास है?

मेरा एक हिस्सा बताता है कि यह वास्तव में आपके सभी चयनकर्ताओं को संदर्भित करने का एक अच्छा तरीका है और उन्हें चर में कैश करता है, ताकि एक ही तत्व के एकाधिक उपयोग को कैश किए गए चर के साथ किया जा सके (एकाधिक डीओएम चयनों के बजाय)।

मुझे का एक अन्य भाग बताओ कि यह एक विरोधी पैटर्न हो सकता है और विशिष्ट तत्वों चुना जाना चाहिए और कैश की गई स्थानीय स्तर पर जरूरत पड़ने पर।

मैंने पूरे ढांचे का उपयोग किया है और कोड के बारे में मिश्रित प्रतिक्रियाएं प्राप्त की हैं, लेकिन कुछ भी ठोस नहीं है। किसी भी सहायता की सराहना की जाएगी। धन्यवाद!

+0

नाम और स्थिति या अन्य चीजों का चयन करने के लिए तत्व का उपयोग करना अच्छा विचार नहीं है क्या कोई व्यक्ति निरीक्षण तत्व के साथ नाम बदलता है? या कल आपका टीममेट थीम बदल रहा है सब कुछ टूटा जाएगा! –

+0

arry या ऑब्जेक्ट में डेटा रखें और स्थानीय स्टोरेज का उपयोग करने के लिए –

+0

तत्व गुणों को पेज लोड पर पार्स किया जाता है और ईवेंट सीधे नोड पर बाध्य होते हैं, इसलिए यदि कोई व्यक्ति निरीक्षण तत्व के साथ नाम बदलता है, तो इससे कोई समस्या नहीं होगी। और 'स्थानीय भंडारण' इसके लिए एक बुरा विचार है। – nashcheez

उत्तर

9

चयनकर्ताओं को कैशिंग एक अच्छी बात है। उन पर लटका एक अच्छा विचार है। यह एक ही चीज़ के लिए बार-बार पूछताछ पर प्रदर्शन में सुधार करता है। आपके ऊपर वाला कोड बैकबोनजेएस और मैरियनेट जेएस कोड के समान दिखता है।

मैं ही आप के लिए कुछ चेतावनियां होती है:

  1. यह पैटर्न मेमोरी लीक हो सकता है। उस मामले पर विचार करें जहां आप सबव्यू को नष्ट करते हैं, लेकिन आप इसे चुनने वाले किसी चीज़ का संदर्भ रखते हैं। इसे एक लटकते सूचक कहा जाता है। दृश्य वास्तव में गायब नहीं होगा। सभी बाध्यियां बनी रहेंगी। घटनाओं के पीछे घटनाएं आग लगती रहेंगी।
  2. अंत में आप एक बग में चले जाएंगे जहां आपने अपनी स्क्रीन का हिस्सा पुनः प्रस्तुत करने का निर्णय लिया था। अपने सभी बाइंडिंग को साफ करना आवश्यक है और आपको हटाने और चयनकर्ताओं को याद रखना होगा। यदि आप ऐसा नहीं करते हैं तो आप लगभग निश्चित रूप से उन मुद्दों पर चले जाएंगे जहां आप सोचते हैं कि एक घटना वास्तव में क्यों गोलीबारी कर रही है लेकिन स्क्रीन पर कुछ भी नहीं होता .... (ऐसा इसलिए होगा क्योंकि यह स्क्रीन से हो रहा है, जिस तत्व को आपने कोशिश की हटाने के लिए, अभी भी मौजूद है ... sorta)।
  3. तत्वों के लिए पूछताछ करने का वर्तमान तरीका पूरे पृष्ठ के विरुद्ध खोजों का कारण बनता है। https://api.jquery.com/find/ पर एक नज़र डालें। यदि आप एक चयनकर्ता को कैश करते हैं और फिर उस चयनकर्ता के भीतर खोज निष्पादित करते हैं तो यह आपको थोड़ा प्रदर्शन टक्कर प्राप्त कर सकता है।
+0

1. क्या होगा यदि मैं बैकबोन जैसे ढांचे का उपयोग नहीं कर रहा हूं जो आम तौर पर मामला है, तो कोई सबव्यू नष्ट नहीं होता है और खतरनाक पॉइंटर का कोई परिदृश्य नहीं होता है। 2. जब तक प्रतिनिधिमंडल सीधे डीओएम नोड पर बाध्य नहीं होते हैं, इसलिए यदि कोई तत्व नोड हटा देता है, तो ईवेंट को स्वचालित रूप से अलग किया जाता है। 3. मैं बच्चों के तत्वों को खोजने के लिए अपने कैश किए गए चयनकर्ताओं पर 'jQuery.find' का उपयोग करता हूं। – nashcheez

+0

@nashcheez आपको ढांचे का उपयोग करने की आवश्यकता नहीं है, आपको बस अपनी खुद की प्रणाली बनाने की जरूरत है जो सफाई (यदि आवश्यक हो) की देखभाल करता है। ऐसे कई ऐप्स हैं जिन्हें किसी भी तरह के क्लीन-अप को संभालने की आवश्यकता नहीं है। वैसे भी, इनमें से कोई भी मामला नहीं है, यह अभी भी एक अच्छा पैटर्न है। यदि आपको साफ-सफाई करने की आवश्यकता है, तो यह साफ-सफाई करना आसान बनाता है। – Parris

+0

आपकी प्रतिक्रिया के लिए निश्चित धन्यवाद। मैं इसके बारे में थोड़ा सा शोध करूँगा। :) – nashcheez

0

मैं पेरिस से सहमत हूं, कैशिंग चयनकर्ता क्या अच्छा है। हमारी परियोजना में हम डीआई और पैटर्न Facade का उपयोग करते हैं। नए मॉड्यूल में एक और संरचना होने के मामले में उस संरचना में जेसन कॉन्फ़िगर किया गया है।

मैं आप सबसे अधिक लगता है:

  • भेजने कॉन्फ़िगर सेटिंग्स;
  • कैश elems केवल elems कुंजी;
  • params.classes में कैश डाइनैमिक्स तत्व नहीं;
  • मददगारों में सामान्य कार्य स्थगित करना; उदाहरण के लिए:

    (function() { 
    var chat = { 
        websocket: new WebSocket("ws://echo.websocket.org/"), 
        that: this, 
        params: { 
         elems: { 
          module: '.container', 
          indicator: ".indicator", 
          statusText: ".status-text", 
          chatHeadNames: ".people li .name", 
          filterInput: "#filter-input", 
          msgInput: "#msg-input", 
          sendBtn: ".send" 
         } 
         classes: { 
          dinamicInput: '.dinamicInput' 
         } 
        }, 
        init: function(params) { 
         opts = $.extend(true, $.extend(true, {}, that.params), params); 
         that.initElementsForModule(that.elements, that.params.elems); 
         this.scrollToBottom(); 
         this.bindEvents(); 
         this.webSocketHandlers(); 
        }, 
        bindEvents: function() { 
         this.toggleChat(); 
         this.filterPeople(); 
         this.compose(); 
        }, 
    
        initElementsForModule = function (elements, identifiers) { 
         var $module, 
          prop; 
    
         for (prop in identifiers) { 
          if (identifiers.hasOwnProperty(prop) && prop !== "module") { 
           elements["$" + prop] = $module.find(identifiers[prop]); 
          } 
         } 
    
        }, 
    
        elements: { 
         module: null, 
         indicator: null, 
         statusText: null, 
         chatHeadNames: null, 
         filterInput: null, 
         msgInput:null, 
         sendBtn: null 
        }, 
        ... 
        ... 
        ... 
        filterPeople: function() { 
         var that = this; 
         this.elements.chatHeadNames.each(function() { 
          $(this).attr('data-search-term', $(this).text().toLowerCase()); 
         }); 
        }, 
        ... 
        ... 
        }; 
    
        chat.init(); 
    })(); 
    
1
  • मुझे लगता है, चैट मॉड्यूल केवल अपने बच्चों के लिए चयनकर्ताओं है, तो यह एक अच्छा पैटर्न है। जैसा:
<div id="chat-module"> 
    <div class="indicator">...</div> 
    <div class="status-text">...<div> 
    ... 
</div> 
<script src="and your chat module.js"></script> 
// your chat module selecting .indicator: 
// $('#chat-module.indicator') 
  • इसके अलावा, अपने मॉड्यूल के लिए एक बन्द करते समारोह जोड़ें। इसलिए, जब आप इसे दृश्य से हटाते हैं (एक पृष्ठ-एप) के रूप में, तो आप अपने चयनकर्ताओं को अलग कर सकते हैं और ईवेंट हैंडलर को अलग कर सकते हैं, जैसे: delete this.elements.indicator और ईवेंट डिटेचिंग कोड।

भी अन्य/बेहतर पैटर्न इस के लिए, की तरह, जब कोई उपयोगकर्ता प्रकार कुछ है, तो आप एक ईवेंट सक्रिय है, और अपने मॉड्यूल में है कि घटना को पकड़ने रहे हैं। यूआई और कोड को अलग करने के लिए।