2012-12-03 10 views
8

Omurga js kullanarak bir koleksiyon koleksiyonu oluşturmaya çalıştığınızda bir isssue çalışıyorum. İşte kod:Backbone js koleksiyonları koleksiyon sorunu

Modeller ve Koleksiyonları: Çalma listesi toplama

var Track = Backbone.Model.extend({ 

    defaults : { 
     title : "" 
    } 
}) 

var TrackCollection = Backbone.Collection.extend({ 

    model : Track, 
}) 

var Playlist = Backbone.Model.extend({ 

    defaults : { 
     name : "", 
     tracks : new TrackCollection, 
    } 
}) 

var PlaylistCollection = Backbone.Collection.extend({ 

    model : Playlist, 
}) 

Oluşturma: Burada

var playlists = new PlaylistCollection; 

// create and push the first playlist 
playlists.push({ name : "classic" }); 
// create and push a track in the playlist just created 
playlists.last().get("tracks").push({ title : "fur elise" }); 

// create and push the second playlist 
playlists.push({ name : "c2c" }); 
// create and push a track in the playlist just created 
playlists.last().get("tracks").push({ title : "fuya" }); 

// display first playlist 
console.log(JSON.stringify(playlists.at(0).toJSON())) 
// display second playlist 
console.log(JSON.stringify(playlists.at(1).toJSON())) 

çıktısı:

{"name":"classic","tracks":[{"title":"fur elise"},{"title":"fuya"}]} 
{"name":"c2c","tracks":[{"title":"fur elise"},{"title":"fuya"}]} 

sorundur, Çıktıda görebileceğimiz gibi, 2 çalma listesinde 2 parça "fur elise" ve "fuy" var Bir".

Sorunun nedeni nedir? ve sadece "c2c" adlı ikinci çalma listesinde "klasik" ve "fuya" adlı ilk çalma listesinde "kürk elise" elde etmek için ne yapmalıyım?

Teşekkür ederiz. yeni örneklerini oluştururken

var Playlist = Backbone.Model.extend({ 
    defaults : { 
     name : "", 
     tracks : new TrackCollection, 
    } 
}); 

Omurga defaults sığ-kopyalar:

cevap

8

Ben senin sorunun PlayList yılında varsayılan tracks nitelik olduğunu düşünüyorum

varsayılanmodel.defaults or model.defaults()
[.. .]
JavaScript’te, nesnede olduğunu unutmayın. s referans ile geçirilir, böylece bir nesneyi varsayılan değer olarak eklerseniz, tüm örnekler arasında paylaşılacaktır.

sonuç varsayılan tracks kullanan her PlayList örneği defaults başvurulan biri olacak tam olarak onun tracks özellik olarak aynı TrackCollection ve bu TrackCollection kullanıyor olacaktır olmasıdır.

kolay çözüm defaults için bir işlev kullanmaktır:

var Playlist = Backbone.Model.extend({ 
    defaults : function() { 
     return { 
      name : "", 
      tracks : new TrackCollection, 
     }; 
    } 
}); 

defaults işlev varsayılan gerektiğinde çağrılır ve her seferinde defaults Eğer yeni bir marka TrackCollection alırsınız denir Bu şekilde varsayılan tracks özniteliği.

İşte size pratik hızlı bir kuraldır:

Eğer defaults dizeleri, sayılar veya boolelerde dışında bir şey koymak istiyorsanız

, yerine defaults nesnenin bir defaults işlevini kullanın.

+0

Tamamen haklısınız, örnekte varsayılanların bir kopyasını yaptığını sanmıştım. Neyse, cevabınız için çok teşekkürler! – Kraoz

+0

Bu harika bilgi ve çok uygun ama başlatma yönteminde yeni bir koleksiyon oluşturmak için daha kolay ve daha açık olabilir mi? –

+1

@AlexMills: Belki.Söyleyecekleri durum hakkında yeterince bilgim yoktu. Bu cevap daha çok "eğer bunu yapacaksan, o zaman böyle yap" gibi bir şey. –