2012-08-13 3 views
7

मैं जीयूआई एक्सटेंशन का पालन कर रहा हूं और नोटिस उदाहरण _isEnabled या isEnabled का उपयोग अंडरस्कोर के बिना करते हैं। दोनों मौजूदा कार्यक्षमता को बढ़ाने या संभवतः बदलने के लिए काम करते प्रतीत होते हैं।_isEnabled के बीच क्या अंतर है और एंगुइला में सक्षम है?

IsEnabled

उदाहरण के लिए, PowerTools आधार वर्ग (जो मौजूदा कार्यक्षमता "विस्तार" प्रतीत नहीं होता है) है:

PowerTools.BaseCommand.prototype.isEnabled = function(selection, pipeline) 
{ 
    var p = this.properties; 

    if (!p.initialized) 
    { 
     this.initialize(); 
    } 

    if (!this.isToolConfigured()) 
    { 
     return false; 
    } 

    if (this.isValidSelection) 
    { 
     return this.isValidSelection(selection, pipeline); 
    } 

    return true; 
}; 

एक उपकरण इस आधार वर्ग का उपयोग करें और घोषणा कर सकते हैं। isValidSelection, उदाहरण के लिए:

PowerTools.Commands.CountItems.prototype.isValidSelection = 
             function (selection) { ... } 

_isEnabled

मुझे लगता है कि एंगुइला मौजूदा कार्यक्षमता के लिए ._isEnabled का उपयोग करता है (कोड में कई स्थानों पर क्रोम के कंसोल में)। उदाहरण के लिए, WhereUsed है:

Tridion.Cme.Commands.WhereUsed.prototype._isAvailable = 
         function WhereUsed$_isAvailable(selection) ... 

निजी कार्यों?

मैं पूर्ववर्ती अंडरस्कोर से निजी चर के लिए एक नामकरण सम्मेलन होने से परिचित हूं। क्या _isEnabled और अन्य फ़ंक्शन जो अंडरस्कोर "निजी" से शुरू होते हैं? यदि ऐसा है तो

  • हम कैसे का विस्तार करना चाहिए इन कार्यों (मौजूदा कोड में अतिरिक्त कार्यक्षमता जोड़ने)?
  • हमें को प्रतिस्थापित करना चाहिए (मौजूदा कोड चलाने के लिए नहीं है, लेकिन हमारे "ओवरराइड" के बजाय हमारे चलते हैं)?

मैं एक ही दृष्टिकोण संभालने कर रहा हूँ अन्य कार्यों है कि एक _isAvailable जैसे, और _invoke अंडरस्कोर से शुरू करने के लिए लागू होता है।

उत्तर

8

निम्न विधियों में एक आदेश के लिए कहा जाता है:

  1. isAvailable
  2. IsEnabled
  3. आह्वान

आधार वर्ग सभी आदेशों के लिए - Tridion.Core.Command - एक मानक है इन तरीकों के कार्यान्वयन। अधिकांश भाग के लिए, यह डिफ़ॉल्ट कार्यान्वयन कमांड के विस्तार के लिए अनुमति देता है। वे अंडरस्कोर विधियों को भी कॉल करते हैं (_is उपलब्ध, _isEnabled, और _execute)।

मुझे नहीं पता कि सीएमई आदेश केवल अंडरस्कोर विधियों को ओवरराइट क्यों करते हैं। शायद किसी ने सोचा कि यह उस तरह से आसान था। उन्हें निजी (या सी # में "संरक्षित" के बराबर) पर विचार किया जाना चाहिए, इसलिए यह वास्तव में मेरे लिए एक बुरी प्रथा की तरह लगता है।

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

संक्षेप में: अंडरस्कोर विधियों का उपयोग करना शायद खराब अभ्यास है, लेकिन कोर कार्यान्वयन ऐसा लगता है कि यह आपके लिए "सही" है। तो मैं अंडरस्कोर विधियों से बचने का लक्ष्य रखूंगा, लेकिन अगर ऐसा करना मुश्किल हो जाता है तो उसे पसीना नहीं पड़ेगा।

पीएस isValidSelection एक PowerTools-only विधि है जो सामान्य तर्क को अलग करता है कि उन्हें सभी को प्रत्येक आदेश के लिए विशिष्ट तर्क से आवश्यकता होती है।

+0

पावरटूल्स पर अच्छा बिंदु 'वैलिड चयन है। पाइपलाइन का प्रबंधन करने के लिए, क्या हम इसे सही/गलत पर सेट करते हैं? मैं .js स्रोत में 'pipeline.stop = true;' देखता हूं। –

+0

पाइपलाइन.स्टॉप = सत्य; वास्तव में इसका मतलब है कि इसे अन्य एक्सटेंशन या अंडरस्कोर विधियों को जारी नहीं रखना चाहिए। "मैं सबसे अच्छा जानता हूं, अन्य उत्तरों की तलाश करना बंद करें" का क्रमबद्ध करें –

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