2013-05-31 13 views
14

मैं हाल ही में "बाध्यकारी" और "लाइव-बाध्यकारी" शब्द को देख रहा हूं, खासकर जावास्क्रिप्ट ढांचे जैसे एम्बर.जेएस, कैन.जेएस, नॉकआउट.जेएस, और बैकबोन.जेएस, और अधिक पारंपरिक रूप से कोको में और उद्देश्य-सी, और आश्चर्य है कि वास्तव में एक बाध्यकारी क्या है? (और वास्तव में "लाइव बाइंडिंग" क्या है?)।बाध्यकारी वास्तव में क्या है?

ऐसा लगता है कि एक ढीले अर्थ से, हम "ए से बी बांध सकते हैं", और फिर हम कह सकते हैं, "ए बी से बाध्य है", और इसका मतलब है कि बी में परिवर्तन ए में स्वचालित रूप से दिखाई देगा, उपयोगकर्ता को पर्यवेक्षक स्थापित करने की चिंता करने के बिना, लेकिन पर्यवेक्षक पहले स्वचालित रूप से सेट हो जाता है और जब बी बदलता है तो स्वचालित रूप से अधिसूचित किया जाता है।

और जब हम ऐसा करते हैं, तो हम "बाध्यकारी" बना रहे हैं।

और एक सख्त भावना से, ऐसा लगता है कोको और ऑब्जेक्टिव-सी इस तरह यह परिभाषित करता है: एक बाध्यकारी एक संपत्तिfoo वस्तु एक की है, और इस संपत्ति का अवलोकन करता है और संपत्ति bar के मूल्य के बदल जाओ ऑब्जेक्ट बी। यह कैसे होता है, हमें परवाह नहीं है और इसे छुपाया जाना चाहिए (एक ब्लैक बॉक्स की तरह), और आमतौर पर इसे पर्यवेक्षक पैटर्न द्वारा कार्यान्वित किया जाता है। तो शब्द "बाध्यकारी" का अर्थ वास्तव में एक "संपत्ति" है, न कि एक क्रिया - और यह संपत्ति अन्य संपत्ति के समान मूल्य में बदल जाती है और बदल जाती है।

और यह बाध्यकारी यूआई तत्वों तक डेटा तक सीमित नहीं है। यह एक बाहरी, बड़ा यूआई तत्व हो सकता है जिसमें यूआई तत्व का एक छोटा टुकड़ा होता है, और बाहरी यूआई तत्व में ऐसी संपत्ति होती है जो आंतरिक यूआई तत्व संपत्ति से जुड़ी होती है। या यह एक गैर-यूआई डेटा प्रॉपर्टी हो सकती है जो किसी अन्य गैर-यूआई डेटा प्रॉपर्टी से जुड़ी हो।

क्या यह बाध्यकारी वास्तव में है? और एक जीवित बाध्यकारी के बारे में क्या?

+4

बस मेरे दो प्रतिशत, IMO आप इसे बिल्कुल सही क्या बाध्यकारी है हो रही है, और रहते हैं बाध्यकारी इसके लिए एक अलग नाम के साथ लगभग एक ही है। – intuitivepixel

+0

मुझे लगता है कि आपने अपने प्रश्न का उत्तर दिया है, बहुत अच्छा। :) –

उत्तर

0

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

"बाइंड" एक क्रिया है, और "डेटा बाइंडिंग" का क्रिया रूप "डेटा बाध्य" या "डेटा बाध्यकारी" होगा। दूसरा उदाहरण दर्शाता है कि "डेटा-बाध्यकारी" भी एक संज्ञा है, जिसे "यूआई/दृश्य गुणों के लिए बाध्यकारी डेटा/मॉडल गुणों का कार्य" के रूप में परिभाषित किया जा सकता है। अपने आप से "बाध्यकारी" के संज्ञा संस्करण के संबंध में, मुझे लगता है कि आप सही हैं कि यह आम तौर पर दो गुणों के बीच बाध्यकारी व्यक्ति को संदर्भित करता है। इस नेत्रहीन प्रदर्शित करने के लिए, कि डॉट्स दो गुण है कि एक दूसरे के लिए बाध्य कर रहे हैं प्रतिनिधित्व करते हैं लगता है:

• ----- •

"बाइंडिंग" यहाँ उन दोनों के बीच लाइन है।

अधिक विशिष्टता हासिल करने के लिए, एक-तरफ़ा बाध्यकारी एक भी तीर के साथ प्रतिनिधित्व किया जा सकता है:

• ----> •

और एक दो तरह से दो तीर के साथ बंधन:

• < --->

"लाइव बाइंडिंग" एक शब्द है जिसका उपयोग यह इंगित करने के लिए किया जाता है कि ऑब्जर्वर पैटर्न का उपयोग किया जा रहा है।मेरा अनुमान है कि "लाइव बाइंडिंग" को अलग करने की इच्छा शायद उन वेब डेवलपर्स से आई थी जिन्होंने पहले फ्रेमवर्क के साथ काम किया था, जहां डेटा-बाइंडिंग प्रति HTTP अनुरोध के बाद केवल एक बार हुआ था, जब पृष्ठ पहले लोड किया जा रहा था। अब जब जावास्क्रिप्ट-भारी वेब ऐप्स मानक बन रहे हैं (आंशिक रूप से अजाक्स के लिए धन्यवाद), एमवीसी की मूल परिभाषा के अनुसार ऑब्जर्वर पैटर्न का उपयोग न करने का कोई कारण नहीं है, इसलिए "लाइव बाइंडिंग" शायद आरआईए के संबंध में एक अनावश्यक शब्द है या मूल डेस्कटॉप या मोबाइल एप्स।

एक तरफ के रूप में, एमवीसी के ट्रिगवे रेन्सकाग की मूल दृष्टि (उन्होंने इसका आविष्कार किया) मूल रूप से सिस्टम में अंतिम उपयोगकर्ता के मानसिक मॉडल को प्रतिबिंबित करने के बारे में है, ताकि "मॉडल" ऐसा कुछ है जो उपयोगकर्ता लगभग मैन्युअल रूप से छेड़छाड़ कर रहा है (या कम से कम उपयोगकर्ता के लिए ऐसा लगता है)। तो पर्यवेक्षक पैटर्न (या पृष्ठ को पुनः लोड किए बिना मॉडल और दृश्य को सिंक में रखने के लिए कम से कम कुछ तंत्र) इसके लिए आवश्यक है और वेब विकास ढांचे के लिए सर्वर-साइड पर अधिकांश कोड वास्तव में एमवीसी नहीं है जैसा मूल रूप से माना जाता है लेकिन बल्कि एक संस्करण जो कोड संगठन के संदर्भ में एक ही सामान्य विचार का पालन करता है। मुख्य रूप से क्लाइंट-साइड ऐप्स के लिए आधुनिक जावास्क्रिप्ट ढांचे वेब विकास के लिए वास्तविक एमवीसी संभव बनाते हैं।

आपके प्रश्न में आपके द्वारा किए गए एक बिंदु पर, मुझे लगता है कि आप यह भी सही हैं जब आप कहते हैं कि बाध्यकारी केवल मॉडल संपत्ति और दृश्य संपत्ति के बीच आवश्यक नहीं है; यह दो मॉडल गुणों (आमतौर पर विभिन्न मॉडलों पर), या दो दृश्य गुणों के बीच हो सकता है। लेकिन मैं आपके दावे से असहमत हूं कि "बाइंडिंग" प्रोग्रामिंग के संबंध में केवल एक संज्ञा है - स्पष्ट रूप से अंग्रेजी में यह "बाइंड" के क्रिया का दूसरा रूप है, "बाइंडिंग का कार्य", और मुझे लगता है कि यह मान्य है प्रोग्रामिंग में भी उपयोग करें। तो अनिवार्य रूप से मैं जो कह रहा हूं वह यह है कि इसका दोहरा अर्थ है, लेकिन मुझे लगता है कि आपके द्वारा प्रस्तावित परिभाषा सबसे आम है। औपचारिक परिभाषा पर मेरा प्रयास यहां दिया गया है:

बाध्यकारी।

  1. दो गुण (आमतौर पर दो अलग-अलग वस्तुओं में) के बीच एक कनेक्शन जो एक दूसरे के साथ सिंक में गुण रखता है, यानि कि एक ही मूल्य है। सिंक्रनाइज़ेशन या तो यूनिडायरेक्शनल या बिडरेक्शनल हो सकता है।
  2. ऐसे कनेक्शन को शुरू करने का कार्य।
+0

यदि आप अंतिम उपयोगकर्ता के मानसिक मॉडल के संबंध में Trygve Reenskaug के विचारों के बारे में अधिक जानने में रुचि रखते हैं, तो मैं निश्चित रूप से एमवीसी के बारे में प्रारंभिक लेखों की जांच करने की सिफारिश करता हूं, लेकिन अपने नए प्रतिमान (जो एमवीसी के साथ पूरक है) भी देखें। , डीसीआई, जो कोड में उपयोगकर्ताओं के मानसिक मॉडल को प्रतिबिंबित करने में सहायता करता है। [यह आलेख] (http://www.artima.com/articles/dci_vision.html) एक अच्छा प्रारंभिक बिंदु है। –

+2

क्या आप कृपया अपने प्रश्न का उत्तर दे सकते हैं, या मैट से उपर्युक्त उत्तर स्वीकार कर सकते हैं (जो मुझे लगता है कि उत्कृष्ट है) ... ताकि यह प्रश्न "अनुत्तरित प्रश्न" अनुभाग से हटा दिया गया हो? धन्यवाद! :) –

0

एक बहुत ही सरल अर्थ में बाध्यकारी का मतलब है, मान लीजिए कि आपके पास प्रगति पट्टी और एक चर एक्स है, हर बार जब आप एक बटन को एक्स वृद्धि के मान को टैप करते हैं। बाइंडिंग का उपयोग करके आप एक्स का मान ले सकते हैं (हर बार जब यह बढ़ता है) और इसे प्रगति पट्टी पर दिखाएं। सी # "पीबी" में कोड की निम्न पंक्ति में प्रगति पट्टी है और टैपकाउंट वेरिएबल है जहां कुल नलियां सहेजी जा रही हैं। यह "पंजाब" का मान चर TapCount

public void tapping 
{  
pb.Value = TapCount; 
} 
0

यह वेनिला जावास्क्रिप्ट में .bind विधि के मूल उपयोग से भिन्न नहीं है करने के लिए बाध्य किया गया है पता चलता है: यदि आप एक विधि के लिए एक वस्तु के दायरे बाँध।

this.iterable.map(this.flush) और this.iterable.map(this.flush.bind(this)) पर विचार करें। सबसे पहले, हम इस पर पुन: प्रयोज्य संपत्ति के प्रत्येक इंटरैक्शन पर एक विधि चला रहे हैं - लेकिन this.flushthis संपत्ति तक पहुंचने के लिए विधि के लिए, आपको इसे this पर बाध्य करना होगा।

इसी तरह, एम्बर जैसे ढांचे में, मॉडल एक घोषणा है। उस मॉडल को रिमोट स्रोत से पॉप्युलेट करने के लिए, आपको एक उदाहरण की आवश्यकता है। हैंडलबार्स से मॉडल को संशोधित करने के लिए, आपको एक उदाहरण की आवश्यकता है। यदि आपका UI परिवर्तन तुरंत मॉडल उदाहरण को प्रभावित करता है - वे बाध्य हैं।

छद्म कोडित: UI.view.bind(modelInstance) RemoteSource.bind(modelInstance)

"लाइव-बाइंडिंग", मेरे अनुभव में, तुरंत यूआई में परिवर्तन पर दूरदराज के स्रोत के लिए डेटा के बाध्यकारी है।

छद्म कोडित: UI.view.bind(modelInstance) RemoteSource.bind(modelInstance) modelInstance.onChange(RemoteSource.update.bind(modelInstance))

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