मैं अभी कुछ समय के लिए jQuery प्लगइन्स विकसित कर रहा हूं, और मुझे लगता है कि मुझे पता है कि अब तक मुझे एक अच्छी तरह से डिज़ाइन करना है। एक मुद्दा मुझे परेशान करता रहता है, और यह एक शक्तिशाली लेकिन सुरुचिपूर्ण तरीके से निजी कार्यों से निपटने का तरीका है।jQuery प्लगइन डिज़ाइन पैटर्न (सामान्य अभ्यास?)
(function($) {
$.fn.myplugin = function(...) {
...
// some shared functionality, for example:
this.css('background-color', 'green');
...
};
$.fn.mypluginAnotherPublicMethod = function(...) {
...
// some shared functionality, for example:
this.css('background-color', 'red');
...
};
}(jQuery));
अब मेरे सवाल है: कैसे बड़े करीने से ऊपर साझा कार्यक्षमता सुखाने के लिए
मेरे प्लगइन्स आम तौर पर कुछ इस तरह दिखाई? एक स्पष्ट समाधान प्लगइन का नाम स्थान के भीतर एक समारोह में यह डाल करने के लिए होगा:
var fill = function($obj, color) {
$obj.css('background-color', color);
};
हालांकि यह समाधान प्रभावी और अच्छी तरह से namespaced है, मैं वास्तव में यह पसंद नहीं। एक साधारण कारण के लिए: मुझे इसे jQuery ऑब्जेक्ट पास करना होगा। अर्थात। जबकि मैं इसे इस तरह कॉल करना चाहते हैं, fill(this, 'red');
: this.fill('red');
हम बस jQuery.fn
में fill
डालकर इस परिणाम प्राप्त कर सकता है मैं इसे इस तरह कॉल करने के लिए की है। लेकिन यह बहुत असहज महसूस करता है। कल्पना करें कि इस दृष्टिकोण के आधार पर दस प्लगइन्स विकसित किए गए हैं और प्रत्येक प्लगइन ने उन पांच निजी 'फ़ंक्शंस को jQuery फ़ंक्शन नेमस्पेस में डाला है। यह एक बड़ी गड़बड़ी में समाप्त होता है। हम इन कार्यों में से प्रत्येक को प्लगइन के नाम से उपसर्ग करके कम कर सकते हैं, लेकिन इससे वास्तव में यह अधिक आकर्षक नहीं होता है। इन कार्यों को प्लगइन के लिए निजी माना जाता है, इसलिए हम उन्हें बाहरी दुनिया में कम से कम नहीं दिखाना चाहते हैं (कम से कम सीधे नहीं)।
तो मेरा प्रश्न है: क्या आप में से कोई भी सुझाव है कि दोनों दुनिया के सर्वश्रेष्ठ कैसे प्राप्त करें। अर्थात्; प्लगइन कोड 'निजी' प्लगइन फ़ंक्शन को this.fill('red')
(या this.myplugin.fill('red')
या यहां तक कि this.myplugin().fill('red')
इत्यादि) के समान तरीके से कॉल करने में सक्षम होने के कारण, jQuery फ़ंक्शन नेमस्पेस प्रदूषण को रोकने के दौरान। और निश्चित रूप से यह हल्के वजन होना चाहिए, क्योंकि इन निजी कार्यों को अक्सर बार कहा जा सकता है।
अद्यतन: अपने सुझाव के लिए धन्यवाद।
मुझे विशेष रूप से डेविड के एक ऑब्जेक्ट प्रकार को परिभाषित करने का विचार पसंद है जिसमें 'निजी' फ़ंक्शन हैं और एक jQuery ऑब्जेक्ट लपेटता है। इसके साथ एकमात्र समस्या यह है कि यह मुझे अभी भी 'निजी' और 'सार्वजनिक' कार्यों को चुनने से रोकता है। शुरू करने के लिए this.fill('red')
जैसे सिंटैक्स को प्राप्त करने का एक बड़ा कारण था।
मैं एक समाधान है जो मुझे काफी सुंदर नहीं पर विचार के साथ समाप्त हो गया है, लेकिन कारण 'दोनों दुनिया के सर्वश्रेष्ठ' को अपील:
$.fn.chain = function(func) {
return func.apply(this, Array.prototype.slice.call(arguments, 1));
};
कौन सा तरह निर्माणों के लिए अनुमति देता है:
this.
find('.acertainclass').
chain(fill, 'red').
click(function() {
alert("I'm red");
});
मैं अन्य स्थानों पर मेरा प्रश्न पार कर गया, जिसने कुछ रोचक प्रतिक्रियाएं भी एकत्र की:
- http://forum.jquery.com/topic/jquery-plugin-design-pattern-common-practice-for-dealing-with-private-functions
- http://groups.google.com/group/jquery-en/browse_thread/thread/fa8ccef21ccc589a
तो कैसे भरने करता है() $ .fn.myplugin() से करने के लिए 'इस' पर पकड़? –
'यह' नहीं होगा (फ़ंक्शन (रंग) {...}) 'फ़ंक्शन? – nickf
मुझे लगता है कि ये इस कोड नमूने में 'इस' हैं: (1) '$ obj.myplugin()': $ obj' (2) 'भरें() ':' विंडो' (3) 'फ़ंक्शन (रंग)': 'विंडो' –