2011-10-20 13 views
14

Hep modeli dükkanını bakılmaksızın girdinin alt durumunda adını sağlanan yapmak için bir yol bulmaya çalışıyorumbackbone.js - özel belirleyiciler

window.model= Backbone.Model.extend({ 
    defaults:{ 
     name: "", 
     date: new Date().valueOf() 
    } 
}) 

gibi basit bir omurga modeli düşünün. yani, bunun en iyi yolu nedir?

  1. Geçersiz Kıl bu temel model üzerinde değişiklikler için dinler ve ayıklanmış girişler saklayan "set" yöntemi
  2. kullanın "SantizedModel": İşte düşünebildiğim hepsi bu. Tüm görünüm kodu daha sonra bu sterilize edilmiş modeli geçerdi.

onu almak, ama ben sadece değerleri depolamak istediğiniz, diyelim ki, kullanıcı Sterlini değerlerini girer ve farklı bir durum hayal ederken teknik olarak daha iyi görünüm ile sağlanabilmesi söz Örneğin "küçük harf" spesifik Veritabanımda $ s. Aynı model için farklı görünümler de olabilir ve kullanılmakta olduğu her yerde bir "toLowerCase" yapmak istemiyorum.

Düşünceler? Bu onun için yapıldığı değil, çünkü ne

cevap

5

Bu bir hack olurdu, ama her zaman bunun için bir doğrulayıcı kullanabilirsiniz: silent sürece (validate fonksiyonu denilen alacak

window.model= Backbone.Model.extend({ 
    validate: function(attrs) { 
     if(attrs.name) { 
     attrs.name = attrs.name.toLowerCase() 
     } 

     return true; 
    } 
}) 

değer, modelde ayarlanmadan önce ayarlanmamıştır, bu nedenle, verileri gerçekten ayarlanmadan önce değiştirmenize olanak tanır.

+0

Teşekkürler. Bunu da düşünmüştüm, ancak bu durumun okunabilir hale getirilmesi açısından geri adım atılmış gibi görünüyordu - set işlevini geçersiz kılıyor ya da bunu küçük harf olarak ayarlayıp yeni bir "setProperty" fonksiyonu ekleyerek daha sonra omurga kümesine geçiriyor. Bir şey özlemediğim sürece? – Naren

+0

"Set" yöntemini geçersiz kılmak için yapmanız gereken şeyleri bitirmek için yanlış bir şey yoktur ... setten önceki bazı ön işlemler nasıl yapılır? Hatta bu tür bir şeyle eşleşirse, bazı işlemcileri çağırmak için 'Backbone.Model.prototype.set'ı genişletmeyi düşünebilirsiniz: https://gist.github.com/1310972 –

+0

validate yalnızca kayıt yöntemi için çağrılır veya options.validate = true öğesi ayarlanmışsa. (sessiz burada kullanılmaz, ama cevap oldukça eski) – webstrap

10

GÜNCELLEME: https://github.com/berzniz/backbone.getters.setters


Bu (sizin modellere eklemek) gibi ayarlanan yöntemi geçersiz kılabilirsiniz: Eğer eklentiyi kullanabilirsiniz

set: function(key, value, options) { 
    // Normalize the key-value into an object 
    if (_.isObject(key) || key == null) { 
     attrs = key; 
     options = value; 
    } else { 
     attrs = {}; 
     attrs[key] = value; 
    } 

    // Go over all the set attributes and make your changes 
    for (attr in attrs) { 
     if (attr == 'name') { 
      attrs['name'] = attrs['name'].toLowerCase(); 
     } 
    } 

    return Backbone.Model.prototype.set.call(this, attrs, options); 
} 
+3

bir döngü yerine (attrs.name) attrs.name = attrs.name.toLowerCase(); – webstrap

+0

İlk parametrenin bir nesne olması durumunda, özniteliklerin ayarlarının ilk parametre olarak bir dizeyle "set" olarak ayarlandığını unutmayın. Böylece normalleştirme sadece ilk parametre bir dizge ise gereklidir. – Webthusiast

3

toot Değil Kendi boynuzum, ama I created a Backbone model "Computed" özellikleri ile bu etrafında almak için. Başka bir deyişle

var bm = Backbone.Model.extend({ 
    defaults: { 
    fullName: function(){return this.firstName + " " + this.lastName}, 
    lowerCaseName: function(){ 
     //Should probably belong in the view 
     return this.firstName.toLowerCase(); 

    } 
    } 
}) 

yılında da bilgisayarlı özelliklerine değişiklikleri işler ve hemen hemen sadece düzenli olarak bu davranın.

The plugin Bereznitskey mentioned da geçerli bir yaklaşımdır.

+0

Şimdi bunu deniyorum ve gerçek işlev yerine, geri dönüş değeri yerine yankılanıyor. varsayılanlar: {distance: function() {return 10; } }, '' 'console.log (this.model.get ('distance'));' ?? – trapper

+0

@trapper - bağlantılı github'dan "BasecomputedModel" adresinden mi çıkıyorsunuz? – Naren