2013-03-18 7 views
8

मैं अपने आवेदन में एक सुपर वर्ग को मर्ज, कि इस तरह एक वस्तु को परिभाषित करता है:ExtJS वस्तुओं

Ext.define('superclass', { 
    myObject: { 
     prop1: true, 
     prop2: 200, 
     .. 
    } 

और एक बच्चे वर्ग है कि ऊपर सुपर क्लास विरासत में मिला है, कि एक ही वस्तु वाणी:

Ext.define('childclass', { 
    extend: 'superclass', 

    myObject: { 
     prop3: false, 
     prop4: false, 
     .. 
    } 

समस्या यह है कि, बाल वर्ग में myObject केवल prop3 और prop4 गुण हैं।

मुझे इसकी आवश्यकता है कि myObject ib बाल वर्ग में सभी prop1, prop2, prop3 और prop4 गुण हैं।

मैं यह कैसे कर सकता हूं?

उत्तर

5

निर्माता में वस्तु का विस्तार (या initComponent में आप Ext.Component का विस्तार करने पर):

Ext.define('childclass', { 
    extend: 'superclass', 

    constructor: function() { 
     this.myObject = Ext.apply({}, this.myObject, { 
      prop3: false, 
      prop4: false 
     }); 
     this.callParent(arguments); 
    } 
}); 

Demo

+0

यह (और Ext.merge समाधान) कर 'myObject' सुपर क्लास प्रोटोटाइप है, जो वांछनीय व्यवहार की तरह प्रतीत नहीं होता है पर बदल जाएगा कर सकते हैं। – wantok

+0

@ वांटोक, आप सही हैं। अपडेट किया गया। –

+1

आप तर्कों को फ़्लिप करना चाहते हैं और इसे .myOappject को तीसरे (डिफ़ॉल्ट) तर्क को निष्पादित करना चाहते हैं। जिस तरह से यह है कि अब चाइल्डक्लास 'कस्टम गुण सुपरक्लास गुणों को ओवरराइड करने में सक्षम नहीं होंगे क्योंकि myObject की गुण बच्चों के ऊपर की ओर लागू हो जाएंगी। – wantok

0

@ आणविक आदमी का जवाब सही है, हालांकि मैं विलय समारोह का उपयोग करूंगा।

चलें कहते हैं कि तुम अपनी पहली config में इस है:

myObject: { 
    prop1: false, 
    person: { 
     name: "John" 
    } 
} 

और अपने दूसरी वस्तु

myObject: { 
    prop2: false, 
    person: { 
     surname: "Doe" 
    } 
} 

आपका व्यक्ति के ऊपर लिख देगा लागू करते हैं और आप केवल person.surname होगा।

कुछ इस तरह में

:

myObject: { 
    prop1: false, 
    prop2: false, 
    person: { 
     surname: "Doe" 
    } 
} 

मर्ज दो वस्तुओं मर्ज हो जाएंगे।

Ext.define('childclass', { 
    extend: 'superclass', 

    constructor: function() { 
     this.myObject = Ext.merge(this.myObject, { 
      prop3: false, 
      prop4: false 
     }); 
     this.callParent(arguments); 
    } 
}); 

नोट मेरी उदाहरण में बताए अनुसार है कि यह केवल sitation में की आवश्यकता होगी, नहीं तो आप आण्विक का जवाब कर सकते हैं।

+0

मुझे इस समाधान और आण्विक मनुष्य के साथ भी समस्या का सामना करना पड़ रहा है। ऐसा लगता है कि myObject नई तात्कालिक वस्तुओं के लिए भी इस नई गुणों को रखता है (ऐसा नहीं है, इस सुपरक्लास को प्राप्त करने वाला दूसरा बच्चा वर्ग प्रकार)। – Beetlejuice

3

दोनों प्रदान किए गए उत्तर सुपर क्लास प्रोटोटाइप की myObject संपत्ति को जैसे ही बाल वर्ग के निर्माण के रूप में बदल देंगे। यह वही नहीं हो सकता जो आप चाहते हैं। मैं सवाल करता हूं कि आप इस तरह के वर्ग प्रोटोटाइप पर एक वस्तु क्यों डाल रहे हैं। यह आमतौर पर ऐसा करने का अच्छा विचार नहीं है। यदि आपको वास्तव में करना चाहते हैं, तो आप इस

Ext.define('childclass', { 
    extend: 'superclass', 

    // I'm adding an empty object here so that myObject on the 
    // prototype does not get overridden. 
    myObject: Ext.merge({}, superclass.prototype.myObject, { 
     prop3: false, 
     prop4: false 
    }); 

}); 
+0

यह काम करता है, लेकिन अब, मुझे बाल वर्ग में सुपरक्लास के लिए "आवश्यकता" शामिल करने की आवश्यकता है। यह सही है ? – Beetlejuice

+0

मेरे मामले में, मैं Deftjs libs का उपयोग कर रहा हूं, जहां मुझे वर्ग, बाध्य तत्वों में "नियंत्रण" ऑब्जेक्ट घोषित करने की आवश्यकता है। – Beetlejuice

+0

@paulo मुझे लगता है कि बच्चे के बच्चे को परिभाषित करने से पहले आपको सुपरक्लास की आवश्यकता होगी। प्रोजेक्ट में मैं काम कर रहा हूं, हम Ext.Loader का उपयोग नहीं करते हैं और सुपरलाक पहले से ही शामिल किया जाएगा, इसलिए ऐसा कुछ है जिसे मैंने नहीं सोचा था। – wantok