2011-10-29 12 views
18

मैं एमवीवीएम पैटर्न देख रहा हूं, विशेष रूप से knockoutjs, और ज्यादातर यह सिर्फ मुझे cringe बनाता है। मैं रखने संरचना, प्रस्तुति के लाभों के बारे में एक लंबे शेख़ी पर नहीं जाना होगा और अलग प्रदर्शित करते हैं, मैं तो बस (एक उदाहरण के रूप में) के लिए कहेंगे: क्याएमवीवीएम क्या है, और क्या इसका इस्तेमाल करना चाहिए?

<button data-bind="click: someJavaScriptFunction">Something</button> 

और

<button onclick="someJavaScriptFunction();">Something</button> 
के बीच का अंतर है

और क्या हमें मार्कअप में इतना व्यवहार नियंत्रण रखना चाहिए? जैसा कि यह साफ और सरल है, ऐसा लगता है कि यह हर वेब प्रोग्रामिंग सिद्धांत के बारे में मैंने कभी सुना है।

क्या मैं गलत हूँ?

+2

मुझे हमेशा विश्वास है कि आपको एक फ़ाइल में एक से अधिक भाषा नहीं होने चाहिए। आम तौर पर मैंने एक आईडी या कक्षा सेट की है और पेज को पूरा करने के बाद भी इसे फ़ंक्शन बाध्य कर दिया है। – dqhendricks

+6

लगता है कि यहां एमवीवीएम के बारे में कम समस्या है और अविभाज्य जावास्क्रिप्ट के पेशेवरों/विपक्ष के बारे में अधिक जानकारी: http://en.wikipedia.org/wiki/Unobtrusive_JavaScript – Craig

+0

@Craig मार्कअप में डेटा-बाइंड होने पर यह प्रतीत नहीं होता है अविभाज्य जेएस की भावना, इसलिए मुझे यकीन नहीं है कि यह वास्तव में क्या है। – heisenberg

उत्तर

7

एमवीवीएम का एकमात्र हिस्सा केवल विशेष रूप से देखें - उस कोड उदाहरण में आपने ऊपर दिया था। नॉकआउट (या कोई अन्य एमवीवीएम लाइब्रेरी) का उपयोग करने का कारण मॉडल को एक दृश्य मॉडल में बाध्य करना आसान बनाता है - इस प्रकार आप अपने दृश्य से मूल्य वापस करने के लिए बहुत सारे बॉयलरप्लेट कोड लिखना बंद कर देते हैं।

मैं wonky जावास्क्रिप्ट/jQuery कोड लोग जा सकते हैं और कुछ इस तरह का उपयोग करें जहां के एक बहुत देखें:

var ex = { 
    some1: $('#textbox1').val(), 
    some2: $('#textbox2').val() 
}; 

इस के साथ समस्या यह है कि यह सचमुच वेब अनुप्रयोग भर अटे पड़े है और यह करने के लिए अत्यंत कठिन हो जाता है बनाए रखें। मुझे नॉकआउट के साथ पता है, जब भी मेरा दृश्य अपडेट हो जाता है, मेरा व्यू मॉडल भी अपडेट किया जाएगा।

प्रत्येक एप्लिकेशन के लिए इसकी आवश्यकता नहीं है, और आपको इसका उपयोग नहीं करना चाहिए क्योंकि यह उपयोग करने के लिए "अच्छा" है। स्पष्ट रूप से इसका उपयोग करने का एक कारण होने की आवश्यकता है, ऊपर मेरा उदाहरण एक कारण है और मुझे यकीन है कि और भी कुछ हैं।

+0

आप किस बारे में बात कर रहे हैं डेटा बाध्यकारी है। और यही वह है जो मूल रूप से मुझे नॉकआउट करने देता है, लेकिन यह डेटा बाध्यकारी करने का एकमात्र तरीका नहीं है। एक jQuery प्लगइन (http://ajaxian.com/archives/jquery-data-binding-templates-and-mobile-john-resig-at-fowa) है, उदाहरण के लिए, जो बाध्यकारी तर्क एम्बेड किए बिना बहुत आसान डेटा बाध्यकारी की अनुमति देता है एचटीएमएल में – nicholas

+0

डेटा-बाध्यकारी, जैसे डोम मैनिपुलेशन, टेम्पलेटिंग या निर्भरता इंजेक्शन, यह मुझे वैसे भी लगता है, तकनीक या उपकरण जो कि किसी भी विशिष्ट पैटर्न का हिस्सा नहीं हैं। – nicholas

+2

@ निकोलस चाहे आप उस पुस्तकालय के साथ जावास्क्रिप्ट में एचटीएमएल आईडी डाल रहे हों, या एचटीएमएल में जावास्क्रिप्ट फ़ील्ड नाम नॉकआउट के साथ हैं, तो इसका वही नहीं है? एमवीवीएम के साथ पावर डेटा बाध्यकारी नहीं है, लेकिन व्यवहार बाध्यकारी है, जब आप राज्य गुणों को देखते हैं और न केवल डेटा गुणों के लिए यह इंटरैक्टिव स्क्रीन विकसित करने के लिए एक आसान तरीका के लिए अनुमति देता है। लेकिन जैसा कि ऊपर बताया गया है कि प्रत्येक उपयोग के मामले में नहीं, टूलबॉक्स में बस एक और टूल। –

13

यहां आपके प्रश्न का एक और सीधा जवाब है।

दूसरे उदाहरण में, आप एक ऐसे फ़ंक्शन का जिक्र कर रहे हैं जो वैश्विक दायरे में होना चाहिए (यानी window ऑब्जेक्ट की एक संपत्ति)।

पहले उदाहरण में, आप वर्तमान दृश्य मॉडल की एक संपत्ति का जिक्र कर रहे हैं।

हां, यह एक सूक्ष्म भेद है, लेकिन यह एक महत्वपूर्ण है। यदि आप ऑन-इवेंट विशेषताओं का उपयोग करते हैं तो आप केवल उन चीजों को संदर्भित कर सकते हैं जो वैश्विक दायरे में मौजूद हैं। इसका मतलब है कि आपको वैश्विक क्षेत्र में जो कुछ भी एक्सेस करना है उसे रखना है, जो बहुत गन्दा कोड की ओर जाता है।

यदि आप घोषणात्मक बाइंडिंग का उपयोग करते हैं, तो इसके बजाय बाइंडिंग का सटीक अर्थ संदर्भ पर निर्भर करता है।

यह एचटीएमएल मार्कअप के बारे में अधिक संयोग के बारे में सोचने में मदद करता है। आप वास्तव में क्या देख रहे हैं दृश्य मॉडल के लिए संरचित पहुंच है। with और forEach को नेस्टेड संदर्भों और अन्य बाइंडिंग के रूप में उनके गुणों के रूप में सोचें। घोषणात्मक बाइंडिंग और अंतर्निहित एचटीएमएल के बीच का रिश्ता अचानक एक्सएसएलटी के साथ काम करने जैसा लगता है।

दो उदाहरण देखें बहुत समान। लेकिन अंतर्निहित अवधारणाएं काफी अलग हैं और जो डेटा को इतना शक्तिशाली और ऑन-इवेंट गुणों को बाध्यकारी बनाती हैं, वे इतनी अप्रिय होती हैं।

ऑन-इवेंट विशेषताएं इस पर फंसे हुए हैं कि वे संरचना के साथ तर्क को मिश्रित नहीं करते हैं। यह है कि वे HTML तत्वों के लिए मनमानी जावास्क्रिप्ट कोड बोल्ट करने के लिए एक कमजोर प्रयास हैं जो अनुप्रयोग तर्क के उचित encapsulation को रोकता है।ऑन-इवेंट विशेषता निम्न-स्तर "हुक" हैं, बाइंडिंग तत्वों के व्यवहार को बढ़ाती है।

सभी ने कहा कि, घोषणात्मक बाइंडिंग का उपयोग करके लोगों ने ऑन-इवेंट विशेषताओं के साथ किया है, वही भयानक चीजें करना संभव है। अंतर यह है कि आप उनके साथ और क्या कर सकते हैं। आपको हमेशा तकनीकों का न्याय नहीं करना चाहिए कि उनका दुरुपयोग कैसे किया जा सकता है - हम यहां सभी वयस्क हैं।

+1

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

+0

धन्यवाद एलन। वह भेद बहुत समझ में आता है। +1 – nicholas

+0

लेकिन कॉल किए गए जावास्क्रिप्ट का दायरा इस बात से अधिक नहीं है कि आप अपनी स्क्रिप्ट को व्यवस्थित करते हैं या नहीं, यह मार्कअप में मौजूद होना चाहिए या नहीं। मैं ऑनक्लिक हैंडलर का उपयोग करके स्कोप्ड फ़ंक्शन को कॉल करने के लिए कुछ आसान (जैसे एक सामान्य jQuery वाक्यविन्यास का उपयोग करने के लिए) पर क्लिक कर सकता हूं। "$ (यह) .डेटा ('myplugin')। कुछ फ़ंक्शन()" ऑनक्लिक हैंडलर का उपयोग करके स्कोप्ड फ़ंक्शन को कॉल करने के लिए। – nicholas

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

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