2011-12-11 23 views
44
Ben backbone.js kullanarak bir model/görünüm/koleksiyonunu yazdım

. Koleksiyonum, modelleri uzak bir sunucudan yüklemek için getirme yöntemini kullanır. Bu koleksiyon için gereken URL, şu gibi bir kimlik gerektiriyor: messages/{id}. Ancak, Koleksiyona seçenekleri iletmek için temiz bir yol bulamadım.backbone.js toplama seçenekleri

backbone.js görünüm inşaat geçirilerek seçenekleri kabul eder: görünümü ([seçenekler]), ancak toplama inşaat üzerine modellerin listesini bekler: koleksiyonundan ([modeller]).

bu koleksiyona parametreler/seçenekler geçen "en temizi" yolu nedir?

Kısaltılmış kod: tarayıcı başlangıçta javascript dosyasını yüklediğinde

var Messages = Backbone.Collection.extend({ 
model: Message, 
    url: 'http://url/messages/' + id 
}); 
+4

belki de daha iyi bir fikir göreli url kullanılarak? – malletjo

cevap

107

bir örnektir, ama url nitelik bir fonksiyonu olabilir dikkati çekiyor bu. Bence daha ayrıntılı eğer, kod, biraz daha okunaklı olduğunu (ve sonuç aynıdır, çünkü sadece düşüncem) Eğer initialize içinde kimliği belirlenen ve eğer bir fonksiyonu referans o:

var Messages = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.id = options.id; 
    }, 
    url: function() { 
    return '/messages/' + this.id; 
    }, 
    model: Message, 
}); 

var collection = new Messages([], { id: 2 }); 
collection.fetch(); 

Sadece emin olsa yapmak - Eğer Model id burada id kafa karıştırıcı değil, değil mi? @ Paul cevabı ve yukarıda benim kod, kendi kimliği ile her, birden Messages koleksiyonları olduğunu varsayalım. API yolu /messages/<id> aslında bir ileti kümesini değil, ileti için başvuruyorsa, o zaman yalnızca url/messages/ koleksiyonuna ayarlamanız gerekir ve Backbone otomatik olarak her model için /messages/<id> kullanır.

+3

Böyle basit ve açık bir örnek için Nick 'teşekkür ederim. Keşke cevabını görebilseydim, bir gün kurtarırdım .... Tekrar teşekkürler. – Shubh

+0

Evet, bu benim için undefined ile sonuçlanır. Aşağıdaki cevap çalışır. –

23

Eğer url özelliği ilan sahip şekilde, değeri bir kez belirlenecek ve 'id' tanımsız olacaktır.

Backbone.Collection seçeneklerini yapıcısında ikinci bağımsız değişken olarak kabul eder, böylece id değerini bir seçenek olarak iletebilir ve ardından url değerini koleksiyonun başlatma işlevi içinde ayarlayabilirsiniz. Paul cevabı iyidir @

İşte

var Messages = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
    this.url = 'http://url/messages/' + options.id; 
    }, 
    model: Message, 
}); 

var collection = new Messages([], { id: 2 }); 
collection.fetch();