2010-07-03 13 views
22

extjs में आप हमेशा constructor() के माध्यम से एक extjs वर्ग का विस्तार कर सकते हैं। Component से निकलने वाली कक्षाओं के लिए आप initComponent() के माध्यम से भी विस्तार कर सकते हैं।Extjs: कन्स्ट्रक्टर या initComponent के माध्यम से कक्षा का विस्तार?

मुझे आश्चर्य है कि initComponent के माध्यम से इतने सारे कोड क्यों बढ़ते हैं, जबकि constructor सार्वभौमिक विस्तार विधि प्रतीत होता है। initComponentconstructor पर स्पष्ट लाभ प्रदान करता है?

उत्तर

17

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

+0

ठीक है, मैं विस्तारक के रूप में कन्स्ट्रक्टर का उपयोग करने के लिए डिफ़ॉल्ट होगा। जब मुझे initComponent के माध्यम से ओवरइड करने की आवश्यकता होती है तो यह एक संकेत है कि मैं कक्षा के आंतरिक के साथ अंतरंग (बहुत अधिक) हूं। –

+1

मैंने यह भी वास्तव में सहायक पाया: http://www.sencha.com/forum/showthread.php?139162-clarification-about-initComponent-constructor-callParent –

+1

मैंने इसे डाउन-संशोधित किया क्योंकि उत्तरदाता एक है एक्स्टजेस के मूल डेवलपर्स लेकिन फिर भी उनके जवाब को समाप्त करते हैं "हालांकि, कुछ मामले हैं जहां यह महत्वपूर्ण है" और फिर हमें कौन नहीं बताता है। मेरी राय में यह मूल प्रश्न का कोई जवाब नहीं है - जिन मामलों में यह महत्वपूर्ण है, वे ओपी की क्वेरी में अंतर्दृष्टि प्रदान कर सकते हैं "क्या initComponent स्पष्ट लाभ प्रदान करता है"। –

2

यहाँ कार्रवाई में जे गार्सिया की किताब ExtJS से कुछ प्रासंगिक उद्धरण हैं:।

"initComponent घटक वर्ग के निर्माता के अंदर निष्पादित किया जाता है, लेकिन केवल घटक के लिए कुछ महत्वपूर्ण सेटअप कार्यों के बाद जगह ले लिया है इन कार्यों में शामिल हैं कैशिंग और वर्ग के उदाहरण के लिए विन्यास वस्तु गुण के आवेदन "

और बाद में, और निर्माता के आलोक में किया जा रहा है, जहां config मापदंडों उदाहरण के लिए लागू हो:

" यदि कॉन्फ़िगर उपवर्ग के उदाहरण कभी होगा क्लोन के माध्यम से क्लोन करने की जरूरत है nfig .... तो कन्स्ट्रक्टर के माध्यम से विस्तार करना सबसे अच्छा विकल्प है। "

वैसे, जय की पुस्तक ExtJS 3 के बारे में होने के बावजूद ऐसा लगता है कि क्लोनकॉन्फ अभी भी ExtJS4 में प्रासंगिक है; देखें:

http://docs.sencha.com/ext-js/3-4/#!/api/Ext.Component-method-cloneConfig

और

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.Component-method-cloneConfig

10

मुझे ExtJS संस्करणों 4.0-4.2 और उससे आगे के मामले में एक अद्यतन जवाब कोशिश करते हैं।

constructor() विधि बनाने से पहले ऑब्जेक्ट/कक्षा है। घटक विधि से पहले घटक घटक है।

constructor: function(config) { 
    // ctor #1 - insert code here to modify config or run code to inject config 
    // probably the cheapest place to make changes - before anything has been built 

    this.callParent(arguments); 

    // ctor #2 - insert code here if you need to make changes 
    // after everything has been rendered and shown, IIUC 
}, 
initComponent: function() { 
    // this function runs between ctor #1 and ctor #2 

    // initComponent #1 - the UI component object tree is created, 
    // (this object and child objects from config { items: [{...}]}) 
    // but they have not yet been rendered to DOM or shown. 

    this.callParent(arguments); 

    // initComponent #2 - I believe this is equivalent to ctor #2, 
    // I would prefer ctor as it is more universal. 
} 

बच्चों या जटिल लेआउट आप शायद initComponent उपयोग करने के लिए है, क्योंकि आप का निरीक्षण किया और घटकों (यूआई वस्तु ग्राफ) में हेरफेर करने की आवश्यकता होगी की आवश्यकता होगी के साथ पैनलों।

लेकिन व्यक्तिगत रूप तत्वों (combobox, बटन, आदि) के लिए तो मैं कन्स्ट्रक्टर के साथ चिपक जाता हूं, जो मुझे लगता है कि हल्का है (किसी भी जटिल वस्तु निर्माण या डीओएम परिवर्तन से पहले) और अधिक सार्वभौमिक है। आईओओ कन्स्ट्रक्टर का उपयोग सरल यूआई, मॉडल और डेटा स्टोर्स के लिए किया जा सकता है; बाद वाले दो initComponent का उपयोग नहीं कर सकते हैं।

तो ऐसा करने का कोई कारण होने पर मैं केवल initComponent का उपयोग करता हूं। अक्सर जब मैं एक initComponent फ़ंक्शन लिखता हूं, मैं बाल UI ऑब्जेक्ट्स में हेरफेर करने की कोशिश कर रहा हूं, और मेरा अगला चरण उस बच्चे के नियंत्रण को अपने स्वयं के एक्स्ट में निकालना है।परिभाषित करें(), बच्चे को नियंत्रण कक्ष में चलाने के लिए कस्टम कोड को स्थानांतरित करें, जो पैरेंट पैनल से जटिल init को हटा देता है। इस प्रक्रिया को मैंने अपने नवीनतम पृष्ठ में 4 बार दोहराया है।

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