Fark

2013-02-26 24 views
9

.create() ve .createWithMixins() arasındaki fark nedir? Bununla ilgili herhangi bir belge bulamıyorum. Sonra didInsertElement yönteminde .create() ve çağrı this._super() kullanarak bir görünüm örneğini oluşturduğunuzda, aşağıdaki hata atılır:Fark

Ember.Object.create artık _super çağrı yöntemleri tanımlayan destekler. Her şey gayet iyi çalışıyor .create().createWithMixins() ile değiştirin

Ama.

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

http://jsfiddle.net/bErRT/3/: İşte kod ve numune js keman olduğunu. Wikipedia kaynaktan

cevap

22

: nesne yönelimli programlama dillerinde

, bir mixin diğer sınıflardan yöntemleri bir arada içeren bir sınıftır. kombinasyonunun nasıl yapıldığı dile bağlıdır, ancak mirasa göre değildir. Kombinasyon, birleşik sınıfların tüm yöntemlerini içerirse, çok sayıda mirasa eşdeğer olan 'dır. Nesnelerin Kor durumlarda

bir bağımsız değişken ile create yöntemiyle oluşturulan, ya da tek bir karma bu tür özelliklerini temsil (kvo) ile ve otomatik olarak doldurulur edilir. Örnek: Öte yandan

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, tek bir nesne örneğine veya başka sınıfa mix başka sınıf tanımı etmenize olanak tanır. Yani, aynı SomeClass koduna sahip olduğunuzu varsayalım, ancak extend aracılığıyla alt sınıflara ayırmak ve başka bir tür oluşturmak istemezsiniz. Bu durumda, yalnızca bir örneğin iki sınıfın tanımına sahip olduğundan emin olmak için Mixin'u kullanabilirsiniz. Örnek: Eğer ilk argüman olarak Mixin geçen bir Mixin yapabilirsiniz extendEm.Object ile yeni bir sınıf oluşturmak istiyorsanız

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' 
}); 

Ancak şöyle:

var AnotherClass = Ember.Object.extend(SomeOtherClass, { 
    firstName: '', 
    lastName: '' 
}); 

var z = AnotherClass.create(); 
z.set('firstName', 'Hiro'); 
z.set('lastName', 'Nakamura'); 
z.doSomething(); 

Kontrol dışarı API Documentation yanı sıra bu JSFiddle.

Düzenleme: _super() gelince sen (extend yoluyla) yeni bir sınıf oluştururken, sadece bu kullanın. Mevcut sınıfların create örneklerini kullandığınızda, _super()'u aramamalısınız.

Başka bir şey. Gördüğünüz gibi, create a View doğrudan deniyorsunuz. Kodunuza bağlı olarak, Ember.View'u genişletmeli ve çerçevenin uygun zamanda sizin için örnek oluşturmasına izin vermelisiniz. Manuel olarak oluşturursanız, iş akışının bazı bölümlerinden DOM'ye eklenmek, kaldırmak, vb.Belki resmin bütününü görmüyorum, ancak bunun tek başına koduna dayalı, sana yerine extend değil orada çağrıyı create ve çağrı gerektiğini düşünüyorum ve sonra _super()

+0

@Joe, teşekkür a aramak mümkün olacak Bu ayrıntılı açıklama için çok fazla. Benim için gerçekten çok yardımcı oldu. Örnek oluşturma sırasında .super() yöntemini kullanmamamız gerekiyorsa, küçültülmüş sürümünü kullandığımda neden bir hata alamıyor? – phkavitha

+0

Emin değilim, ama belki de küçültülmüş versiyon birkaç iddia çıkartıyor. Genellikle hata ayıklama/geliştirme sürümü, üretim kullanımı için minified iken olası sorunları tanımlamanıza yardımcı olacak tüm iddialara sahiptir, dolayısıyla testinizin tamamlandığını varsayar. – MilkyWayJoe