2013-02-26 23 views
9

में .create() और .createWithMixins() के बीच अंतर .create() और .createWithMixins() के बीच क्या अंतर है? मैं इसके बारे में कोई दस्तावेज नहीं ढूंढ पा रहा हूं। जब मैं तो didInsertElement विधि में .create() और फोन this._super() का उपयोग कर एक दृश्य के उदाहरण बनाने के लिए, निम्न त्रुटि फेंक दिया जाता है:एम्बर

Ember.Object.create नहीं रह गया है तरीकों कि _super फोन को परिभाषित करने का समर्थन करता है।

लेकिन, जब मैं .create().createWithMixins() के साथ सब कुछ ठीक काम करता है की जगह।

App.SampleView = Ember.View.create({ 
    sampleProperty : "a", 
    didInsertElement : function(){ 
     this._super(); 
     this.set("sampleProperty", "b");   
    } 
}); 

http://jsfiddle.net/bErRT/3/: यहाँ कोड और नमूना js बेला है।

उत्तर

22

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, आप कर सकते हैं extendEm.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() पर कॉल नहीं करना चाहिए।

एक और बात। मुझे लगता है कि आप createView पर सीधे प्रयास कर रहे हैं। मेरा मानना ​​है कि, आपके कोड के आधार पर, आपको Ember.View का विस्तार करना चाहिए और फ्रेमवर्क को उचित समय पर आपके लिए उदाहरण बना देना चाहिए। यदि आप मैन्युअल रूप से बनाते हैं, तो आप इसके वर्कफ़्लो के कुछ हिस्सों के लिए जिम्मेदार होंगे जैसे कि इसे डीओएम में जोड़ना, इसे हटा देना आदि।शायद मैं पूरी तस्वीर नहीं दिख रहा है, लेकिन अकेले इस कोड के आधार पर, मुझे लगता है कि आप नहीं कॉल create वहाँ और extend बजाय फोन करना चाहिए, और फिर आप कॉल करने के लिए _super()

+0

@Joe, धन्यवाद एक में सक्षम हो जाएगा इस विस्तृत स्पष्टीकरण के लिए बहुत कुछ। यह वास्तव में मेरे लिए बहुत उपयोगी था। अगर हमें उदाहरण के दौरान .super() का उपयोग नहीं करना चाहिए, तो अगर मैं इसके minified संस्करण का उपयोग करता हूं तो एम्बर कोई त्रुटि क्यों नहीं फेंकता है? – phkavitha

+0

मुझे यकीन नहीं है, लेकिन शायद minified संस्करण कुछ दावों को बाहर निकाल देता है। आम तौर पर डीबग/विकास संस्करण में संभावित मुद्दों की पहचान करने में आपकी मदद करने के लिए सभी दावे हैं, जबकि उत्पादन के उपयोग के लिए मिनीफाइड है, इसलिए यह मानता है कि आप परीक्षण कर रहे हैं। – MilkyWayJoe

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