2014-10-04 4 views
9

संदर्भ के नीचे दोनों कोड ब्लॉक, संदर्भ में और पूरी तरह कार्यात्मक रूप से समकक्ष लगते हैं। मैं js prototypes उचित रूप से अच्छी तरह से समझता हूं, इसलिए मैं उनके बारे में नहीं पूछ रहा हूं (जब तक कि एकमात्र अंतर है)।व्यूमोडेल। प्रोटीोटाइप। फ़ंक्शन बनाम स्वयं। एक व्यूमोडल में फ़ंक्शन?

बल्कि, जैसा कि नीचे दिखाया एक दृश्य के मॉडल पर एक विधि डाल करने के लिए दो आसान तरीके की तुलना, कोई निहितार्थ हैं/Knockout, उदा मतभेद बाध्यकारी समय?

परिभाषित ([ "नॉकआउट", "पाठ ./ home.html!"], समारोह (ko, homeTemplate) {// < - एक AMD Module

function HomeViewModel(route) { 
      var self = this; 
      self.message = ko.observable('Snacks!'); 

      self.eatSomething = function() { 
        self.message('Yum, a viewmodel snack.'); 
      }; 
    } 
    return { viewModel: HomeViewModel, template: homeTemplate }; 
}); 

जोड़ने बनाम

परिभाषित ([ "नॉकआउट", "! पाठ ./ home.html"], समारोह (ko, homeTemplate) {

0123: प्रोटोटाइप के माध्यम से विधि

});

(कोड एक Knockout generator के माध्यम से Yeoman's मचान उत्पादन का एक सरल आधुनिक है। यह एक knockout component, एक काफी हाल ही में (KO 3.2) और बहुत स्वागत सुविधा के लिए बॉयलर प्लेट कोड बनाया। एक अच्छा KO घटक व्याख्याता here. है)

उत्तर

11

पहले उदाहरण में, समारोह self (जो नया उदाहरण के लिए एक संदर्भ के लिए सेट है का उपयोग करता है के बाद से) के बजाय this, चाहे कितना समारोह कहा जाता है/बाध्य है, यह हमेशा सही ढंग से अपने स्वयं के message नमूदार स्थापित करेगा ।

दूसरे उदाहरण में, जब data-bind="click: eatSomething" जैसे फ़ंक्शन को सामान्य रूप से बाध्यकारी करते हैं, तो आपको वही परिणाम मिल जाएगा। नॉकआउट वर्तमान डेटा के बराबर this के मान के साथ फ़ंक्शन को कॉल करता है।

यदि आपके पास एक परिदृश्य था जहां आपको किसी भिन्न संदर्भ से फ़ंक्शन को कॉल करने की आवश्यकता होती है (हो सकता है कि आपके व्यू मॉडल में एक बच्चा ऑब्जेक्ट है जिसे आप with या टेम्पलेट के विरुद्ध उपयोग कर रहे हैं)। तो आप data-bind="click: $parent.eatSomething" जैसे बाइंडिंग का उपयोग कर सकते हैं। केओ अभी भी वर्तमान डेटा के बराबर this के साथ फ़ंक्शन को कॉल करेगा (जो $parent नहीं होगा), इसलिए आपको कोई समस्या होगी। हालांकि प्रोटोटाइप पर समारोह डालने की

एक लाभ यह है, कि यदि आप HomeViewModel के कई उदाहरणों बनाई गई वे सभी साझा करेंगे प्रत्येक उदाहरण eatSomething समारोह की अपनी एक प्रतिलिपि प्राप्त करने के लिए अपने प्रोटोटाइप के माध्यम से एक ही eatSomething समारोह के बजाय है। यह आपके परिदृश्य में चिंता नहीं हो सकता है, क्योंकि आपके पास केवल HomeViewModel हो सकता है।

आप यह सुनिश्चित कर सकते हैं कि संदर्भ इसे कॉल करके सही है: data-bind="click: $parent.eatSomething.bind($parent)। इस कॉल का उपयोग करके, एक नया रैपर फ़ंक्शन तैयार होगा जो मूल संदर्भ के साथ मूल को कॉल करेगा (this का मान)। वैकल्पिक रूप से, आप इसे बाध्यकारी क्लीनर रखने के लिए दृश्य मॉडल में भी बांध सकते हैं। किसी भी तरह से, आप इसे प्रोटोटाइप पर डालने के कुछ मूल्य खो देते हैं, क्योंकि आप प्रत्येक उदाहरण के लिए रैपर फ़ंक्शन बना रहे हैं। फ़ंक्शन का "गड़बड़" केवल प्रोटोटाइप पर कम से कम एक बार मौजूद होगा।

मैं अपने कोड में प्रोटोटाइप का उपयोग करता हूं, लेकिन इसमें कोई संदेह नहीं है कि self तकनीक (या खुलासा मॉड्यूल पैटर्न की तरह कुछ) का उपयोग this के मूल्य से आपकी चिंता को कम कर सकता है।

+0

सहायक स्पष्टीकरण - ** 'खुलासा मॉड्यूल पैटर्न' ** से आपका क्या मतलब है? बीटीडब्लू, मैं बस आपके [नॉकआउट एएमडी हेल्पर्स] (https://github.com/rniemeyer/knockout-amd-helpers) पर ठोकर खा रहा हूं - बेहद उपयोगी दिखता है - खासकर मॉड्यूल जैसे अपने टेम्पलेट्स। तो इसके लिए भी बहुत धन्यवाद! –

+0

खुलासा मॉड्यूल पैटर्न का वर्णन करने वाले कुछ लिंक यहां दिए गए हैं, यहां एक है: http://weblogs.asp.net/dwahlin/techniques-strategies-and-patterns-for-structuring-javascript-code-revealing- मॉड्यूल- पैटर्न। असल में, आप जो भी तरीके आंतरिक रूप से चाहते हैं उसे परिभाषित करते हैं और वेरिएबल को सीधे संदर्भित करने में सक्षम हैं। फिर, आप उन मॉड्यूल से सार्वजनिक "एपीआई" वापस कर सकते हैं जिन तरीकों से आप उन्हें बेनकाब करना चाहते हैं, जिनके नाम आप बेनकाब करना चाहते हैं। उम्मीद है की वो मदद करदे! –

+1

@RPNiemeyer - क्या आपने इस सटीक प्रश्न पर कोई ब्लॉग नहीं लिखा है? मैंने सोचा कि मुझे अतीत में पढ़ना याद आया और गुगल रहा है और यह वह जगह है जहां मैं समाप्त हुआ – user210757

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