2011-05-09 21 views
14

Modeller koleksiyonumda ve modeller hakkında bazı ek bilgiler içeren backbone.js'yi kullanarak bir durumum var. Örneğin, miktarların bir listesini döndürdüğümü hayal edin: her modelle ilişkili bir miktarları vardır. Şimdi, her bir miktarın biriminin daima aynı olduğunu varsayın: quarts. Sonra geri hizmetinden olsun json nesnesi gibi bir şey olabilir:Backbone.js koleksiyonunda kalıcı ve yükleme meta verileri

{ 
    dataPoints: [ 
     {quantity: 5 }, 
     {quantity: 10 }, 
     ... 
    ], 
    unit : quarts 
} 

Şimdi omurga koleksiyonları doğal koleksiyonu ile bu meta-veri ilişkilendirilmesi için hiçbir gerçek bir mekanizma var, ama bu soruya bana önerildi: Setting attributes on a collection - backbone js koleksiyonunu .meta(property, [value]) stil fonksiyonu ile genişletebiliyorum - bu harika bir çözüm. Ancak, doğal olarak, bu verileri yukarıda sahip olduğumuz gibi bir json cevabından temiz bir şekilde alabilmek istiyoruz.

Backbone.js parse(response) işlevini verir; bu da koleksiyonun model listesinin nereden alınacağını url özniteliğiyle birlikte belirtmemizi sağlayan parse(response) işlevini sağlar. Bununla birlikte, zaten mevcut olan kısmi işlevselliği kaldıracak olan fetch()'u aşırı yüklemeden daha akıllı bir işlev yapmanın farkında olmamın bir yolu yoktur.

Sorum şu: Bu, ulaşmak istediklerime ulaşmak için fetch()'u aşırı yüklemeden (ve bunun süper sınıf uygulamasını çağırmak için denemekten) daha iyi bir seçenek var mı?

Teşekkür

Şahsen

cevap

22

, başka Model içine Collection örtecek ve sonra şöyle, parse geçersiz:

var DataPointsCollection = Backbone.Collection.extend({ /* etc etc */ }); 
var CollectionContainer = Backbone.Model.extend({ 
    defaults: { 
     dataPoints: new DataPointsCollection(), 
     unit: "quarts" 
    }, 
    parse: function(obj) { 
     // update the inner collection 
     this.get("dataPoints").refresh(obj.dataPoints); 

     // this mightn't be necessary 
     delete obj.dataPoints; 

     return obj; 
    } 
}); 

Collection.refresh() çağrı yeni değerlerle modeli günceller. Önceden önerildiği gibi Koleksiyona bir özel meta değerini geçirmeniz, bu meta değerlere bağlanabilmenizi engelleyebilir.

+0

demiyorlar Modelleri geçersiz kılmak için 'parse' gibi tüm özelliklerine sahip olmak. Koleksiyonun meta verilere bir anlamı olması gerekiyorsa, o zaman Omurga'nın meta-on-collection çözümü, IMO ile 'out-of-band' yerine, o nesne yapısında bunu yansıtıyor olabilir. – Stoive

+0

Bu benim için çok makul görünüyor. Bunun anahtarı, model nesnesinde ve koleksiyonda ayrıştırma/URL/getirme işlevini geçersiz kılma yeteneğidir. Çok teşekkürler. – idbentley

+6

Collection.refresh() şimdi kullanımdan kaldırıldı, bunun yerine Collection.reset() öğesini kullanın. – JMWhittaker

0

Bu meta veri, koleksiyona ait değil. Kodun adına veya başka bir tanımlayıcısına aittir. Kodunuz, sahip olduğu koleksiyonun sadece kuvars elementlerle dolu olduğunu bilmelidir. Url, kuvars elementlerine işaret ettiğinden beri zaten var. Eğer gerçekten bu verileri almak gerekiyorsa

var quartzCollection = new FooCollection(); 
quartzCollection.url = quartzurl; 
quartzCollection.fetch(); 

neden sadece bu size bağlı diğer yazı var cevabı çelişmektedir biliyorum ama Koleksiyonları yok

_.uniq(quartzCollecion.pluck("unit"))[0];

+0

Birim, AJAX çağrısından önceden bilinmemektedir. "Pluck" kullanmıyorum çünkü koleksiyonumdaki her model nesnesinin üniteyi saklamasını gerektiriyordu - bu da yanıt büyüklüğünün sadece meta-veri olarak bir kez birleştirmekten daha büyük olmasına neden oluyordu.Ayrıca, şüphelendiğim gibi bir operasyon yapmak için önemli bir yük vardır. – idbentley

+0

@idbentley Yine de {dataPoints: ..., unit} model oldu. Hangisi. Sadece bu dataPoints bir koleksiyon. Yani @Stoive cevapta belirtilen gibi davranın. Ayrıca koparma işlemi bu masraf değildir. Sadece modelleri birimle eşler. – Raynos

İlgili konular