2011-06-28 12 views
8

Backbone.Model nesnelerimin örneklerinden erişmek istediğim statik özelliklere sahibim. Metodu çağırmak için ana kurucuyu kodlayabildiğimi biliyorum ama bu, polimorfik statik fonksiyonlara sahip olmamı engelliyor. Örneğin, başka bir kodu değiştirmek zorunda kalmadan, ExtendedInventory numaralı telefondan foo işlevini geçersiz kılmak istiyorum.Model adını belirtmeden, o modelin bir örneğinden statik bir Backbone.Model işlevini nasıl çağırabilirim?

var Inventory = Backbone.Model.extend({}, 
    //STATIC 
    { 
     foo: function() { 
      alert('bar'); 
     } 
    }); 

var i = new Inventory({}); 
i.constructor.foo(); //This works! 

var ExtendedInventory = Inventory.extend({}); 

var ei = new ExtendedInventory({}); 
ei.constructor.foo(); //THIS DOES NOT WORK 


//How do I generically access the `Inventory.foo()` function via the `ei` object. I would 
+0

Yani, bu işleri ama çok iyi anlamıyorum ve sadece Firefox'ta çalışıyor : ei.constructor.prototype .__ proto __. constructor.foo() –

+1

Ben bu soruya gelen herkes için yararlı olabilir omurga ile statik üyeleri kullanarak örnekleri ile bir blog yazdım. http://taurenmills.wordpress.com/2011/10/08/backbone-js-with-class-properties/ – Tauren

+0

+1 sınıf özelliklerine dikkat çekmek için – Chuck

cevap

2

Örneğinizde tam olarak ne işe yaramaz? Hem Firefox hem de IE'de, amaçlanan sonuca benzeyen 'bar'lı iki pop-up alıyorum. Statik kısmı da iyi davranıyor gibi görünmektedir, bkz. this jsfiddle.

;

+0

Teşekkür ederiz! Kafamı duvara çarpıyordum ama daha yeni bir sürüme geçmek umduğum gibi çalışmayı başardı. Ana Omurga sitesinden 0.3.3 indirme ile çalışmıyor (hata: ei.constructor.foo bir işlev değildir). Keşke niçin farklı davrandığını anladım, böylece bir fark yaratacağım ve anlayabileceğimi göreceğim. –

4

Hmm (bu btw Omurga BAŞ sürümüyle olduğunu fark yaparsa bilmiyorum). Yukarıdaki kod işe yaramasa da, bu şekilde bırakmayacağım. İşlev, sınıfın bir nesnesi aracılığıyla mantıksal olarak erişilebilirse, sınıf/"statik" işlevini çağıran temel sınıfta bir örnek yöntemi tanımlayın. Bu kod temizleyici ve yapar daha net, ben (istemciler biraz gizli sözdizimi hatırlamak gerekmez, artı) düşünüyorum:

var Inventory = Backbone.Model.extend({ 
    foo: function() { 
     this.constructor.foo(); 
    } 
}, { 
    foo: function() { 
     alert('bar'); 
    } 
}); 

var i = new Inventory({}); 
i.foo(); //This works! 

var ExtendedInventory = Inventory.extend({}); 

var ei = new ExtendedInventory({}); 
ei.foo(); 
+1

Bu öneriyi beğendim ... teşekkürler! –

+0

+1, statik işlevleri kaydetmek için ikinci parametreyi kullanmak için +1, örneğinizde asla statik kullanmamış olsanız bile: D Inventory.foo() çalışıyor, teşekkürler;) – MaBi

İlgili konular