2010-08-01 4 views
12

में "निजी" फ़ंक्शन ओवरराइड करें मैं बंदरगाह के कुछ खींचने योग्य कोड * बंदर-पैचिंग कर रहा हूं।जावास्क्रिप्ट

लक्ष्य मूल स्रोत फ़ाइलों को संशोधित करने और गतिशील रूप से आंतरिक कार्यों में से एक को पैच करने से बचाना है।

समारोह _generatePosition इस तरह घोषित किया जाता है:

(function($) { 

    $.widget("ui.draggable", $.ui.mouse, { 
     ... 
     _generatePosition: function(event) { 
      ... 
     } 
    } 
})(jQuery); 

यह इसके बारे में गतिशील प्रतिस्थापन प्राप्त करने के लिए संभव है?


* तो यह गणना करता है पेरेंट तत्व के शीर्ष करने के स्नैप ग्रिड रिश्तेदार और तत्व के शीर्ष के सापेक्ष नहीं घसीटा जा रहा है। अधिक जानकारी के लिए here देखें। नीचे टिप्पणी के लिए

उत्तर

11

आप व्यक्तिगत उदाहरणों में हेरफेर कर सकते हैं:

.draggable().data("draggable")._generatePosition = function() {}; 

या प्रोटोटाइप, संशोधित करने, सभी उदाहरणों को प्रभावित करने वाले:

$.ui.draggable.prototype._generatePosition = function() {}; 
+0

प्रोटोटाइप को संशोधित करना निश्चित रूप से .data() पर एक जीत है, धन्यवाद! – Art

+1

मुझे वास्तव में एक ढांचे (जैसे वर्डप्रेस) में काम करते समय इंस्टेंस मैनिपुलेशन पसंद आया, जहां आप कभी नहीं जानते कि ड्रैगगेबल पर मूल रूप से specced के रूप में अन्य प्रक्रियाओं की गणना क्या हो सकती है। –

+0

एक कांस्य पदक है। –

3

संपादित करें: ऐसा लगता है कि आप यह कर सकते हैं संपादित इन (पिछले विजेट पुनर्लेखन के बाद), लेकिन मैं अभी भी दूर करने होगा। Here's an example of the base method, यदि आप चाहें तो वहां से संशोधित कर सकते हैं, लेकिन यह ध्यान रखें कि भविष्य में रिलीज में तोड़ सकता है। विजेट के किसी भी "विरासतकर्ता" इन परिवर्तनों को नहीं उठाएंगे, यह सुनिश्चित नहीं है कि यह कोई समस्या है या नहीं।


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

मामले में मामला: jQuery UI 1.8 ने position utility में बहुत सारे कोड को स्थानांतरित कर दिया है, जिससे आपको बहुत से निजी कोड क्लीनअप की अनुमति नहीं मिली है, क्योंकि यह बहुत बड़ा अनुकूलन/कोड कमी करने से पहले सभी निजी थे लोगों को बाएं और दाएं तोड़ने के बिना।

+1

इसमें एक अग्रणी अंडरस्कोर है, इसलिए इसे निजी के रूप में माना जाना चाहिए ... लेकिन क्या आप वाकई ऑब्जेक्ट को खोद नहीं सकते हैं और संपत्ति को किसी भिन्न फ़ंक्शन पर सेट नहीं कर सकते हैं? यह निजी नहीं है [यह] (http://www.crockford.com/javascript/private.html) ...? – sje397

+2

@ sje397 - यह निजी में सिर्फ '_' नहीं है, यह सिर्फ निजी के रूप में इसे पहचानने के लिए सम्मेलन है (लाइब्रेरी के माध्यम से काफी संगत)। यह विजेट निर्माता में पारित किया गया है जो ऑब्जेक्ट्स को विभिन्न निजी तरीकों को निर्दिष्ट करता है (फिर से * वे * इसे कैसे करते हैं)।यदि आप कोड में देखते हैं तो यही कारण है कि इसे 'this._generatePosition' के माध्यम से बुलाया जाना चाहिए :) –

+0

यदि आप उन्हें एक्सेस कर सकते हैं (मेरी दूसरी पोस्ट देखें), तो वे वास्तव में निजी नहीं हैं, वे अधिक पहुंच योग्य नहीं हैं :) – peol

3

आप वास्तव में इन्हें संशोधित कर सकते हैं, लेकिन केवल एक तत्व के आधार पर जहां तक ​​मुझे पता है। लेकिन आप आसानी से अपने खुद $ .fn.draggable आवरण बना सकते हैं, और सिर्फ मूल आवरण फोन और चलाने के इस: $.ui.draggable.prototype._generatePosition = fn का उपयोग करके draggableElement.data('draggable')._generatePosition = fn

  • रूप Jörn Zaefferer ने बताया, आप भी खींचने योग्य प्रोटोटाइप, संशोधित कर सकते