Wikipedia से:
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषाओं में, mixin एक वर्ग है, जो अन्य वर्गों से विधियों के संयोजन होता है। कैसे संयोजन किया जाता है भाषा पर निर्भर करता है, लेकिन यह विरासत से नहीं है। यदि संयोजन में संयुक्त वर्गों के सभी विधियां हैं तो यह एकाधिक विरासत के बराबर है।
वस्तुओं की एंबर मामलों में कोई तर्क के साथ create
विधि के साथ बनाई गई हैं, या एक ही हैश (KVO) कि उस प्रकार के गुण का प्रतिनिधित्व के साथ है, और वे स्वतः भर जाती है। उदाहरण:
var SomeClass = Ember.Object.extend({
name: '',
url: ''
});
// this instance will have a "name" and a "url" properties with blank values
var someInstance = SomeClass.create();
// this instance will have the same properties, but now
// their values will be populated
var anotherInstance = SomeClass.create({
name: 'Ember.js',
url: 'http://emberjs.com'
})
दूसरी ओर, crateWithMixins
, एक वस्तु उदाहरण में या किसी अन्य वर्ग में मिश्रण अन्य वर्ग परिभाषा के लिए आप की अनुमति है। तो मान लीजिए कि आपके पास ऊपर SomeClass
है, लेकिन आप इसे extend
के माध्यम से उप-वर्ग नहीं करना चाहते हैं और एक और प्रकार बना सकते हैं। इस मामले में आप यह सुनिश्चित करने के लिए Mixin
का उपयोग कर सकते हैं कि केवल एक ही उदाहरण में दो वर्गों की परिभाषा होगी। उदाहरण:
var SomeClass = Ember.Object.extend({
name: '',
url: ''
});
// note that you don't extend a mixin, you only create
var SomeOtherClass = Ember.Mixin.create({
doSomething: function() {
console.log('doing my thing');
}
});
// This instance will have a method called "doSomething"
var x = SomeClass.createWithMixins(SomeOtherClass, {
name: 'Ember.js',
url: 'http://emberjs.com'
});
// this instance only has methods/properties defined in "SomeClass"
// therefore, no method called "doSomething"
var y = SomeClass.create({
name: 'Google',
url: 'http://google.ca'
});
हालांकि, इस प्रकार आप एक Mixin
, आप कर सकते हैं extend
Em.Object
साथ एक नया वर्ग बनाने के लिए, पहले तर्क के रूप में Mixin
गुजर चाहते हैं:
var AnotherClass = Ember.Object.extend(SomeOtherClass, {
firstName: '',
lastName: ''
});
var z = AnotherClass.create();
z.set('firstName', 'Hiro');
z.set('lastName', 'Nakamura');
z.doSomething();
चेक बाहर API Documentation साथ ही यह JSFiddle।
संपादित: जैसा कि _super()
के लिए, आप केवल इस का उपयोग जब आप एक नया वर्ग बनाने (extend
के माध्यम से)। जब आप मौजूदा कक्षाओं के create
उदाहरण देते हैं, तो आपको _super()
पर कॉल नहीं करना चाहिए।
एक और बात। मुझे लगता है कि आप create
View
पर सीधे प्रयास कर रहे हैं। मेरा मानना है कि, आपके कोड के आधार पर, आपको Ember.View
का विस्तार करना चाहिए और फ्रेमवर्क को उचित समय पर आपके लिए उदाहरण बना देना चाहिए। यदि आप मैन्युअल रूप से बनाते हैं, तो आप इसके वर्कफ़्लो के कुछ हिस्सों के लिए जिम्मेदार होंगे जैसे कि इसे डीओएम में जोड़ना, इसे हटा देना आदि।शायद मैं पूरी तस्वीर नहीं दिख रहा है, लेकिन अकेले इस कोड के आधार पर, मुझे लगता है कि आप नहीं कॉल create
वहाँ और extend
बजाय फोन करना चाहिए, और फिर आप कॉल करने के लिए _super()
@Joe, धन्यवाद एक में सक्षम हो जाएगा इस विस्तृत स्पष्टीकरण के लिए बहुत कुछ। यह वास्तव में मेरे लिए बहुत उपयोगी था। अगर हमें उदाहरण के दौरान .super() का उपयोग नहीं करना चाहिए, तो अगर मैं इसके minified संस्करण का उपयोग करता हूं तो एम्बर कोई त्रुटि क्यों नहीं फेंकता है? – phkavitha
मुझे यकीन नहीं है, लेकिन शायद minified संस्करण कुछ दावों को बाहर निकाल देता है। आम तौर पर डीबग/विकास संस्करण में संभावित मुद्दों की पहचान करने में आपकी मदद करने के लिए सभी दावे हैं, जबकि उत्पादन के उपयोग के लिए मिनीफाइड है, इसलिए यह मानता है कि आप परीक्षण कर रहे हैं। – MilkyWayJoe