2014-04-03 6 views
6

Rozumiem, że wartość "this.collection" pokaże tylko pierwszą kolekcję, ale czy jest ona w inny sposób zgodna ze standardem Backbone? Czy też automatycznie zostanie usunięty z poprzedniej kolekcji?Czy pojedyncza instancja modelu szkieletu może znajdować się w dwóch kolekcjach jednocześnie?

var MyModel = Backbone.Model.extend({defaults: {test: '123'}}); 
var MyCollection1 = Backbone.Collection.extend({model: MyModel}); 
var MyCollection2 = Backbone.Collection.extend({model: MyModel}); 

var instance = new MyModel({ 
    test: '456' 
}); 
MyCollection1.add(instance); 
MyCollection2.add(instance); 

console.log(instance.collection); //Returns "MyCollection1" only, not an array of all collections of which this model is a member 

Powyższy kod działa, po prostu zastanawiam się, czy coś łamie (szczególnie związane ze zdarzeniami), robiąc to.

+0

mógłbyś opisać wydać w szczegółach? – Evgeniy

+0

Oczywiście, chociaż pytam w ogólnym znaczeniu, nie w konkretnym przypadku. – AlexZ

+0

czy model szkieletu udostępnia atrybut kolekcji? – Saravanan

Odpowiedz

8

TL; DR Nic nie złamie, można to sprawdzić patrząc na źródła, add jest skróconym sposobem, set(model, {add: true, remove: false, merge: false})

Jeśli spojrzeć na set method część gdzie modifies the model is here,

_addReference: function(model, options) { 
    this._byId[model.cid] = model; 
    if (model.id != null) this._byId[model.id] = model; 
    if (!model.collection) model.collection = this; 
    model.on('all', this._onModelEvent, this); 
}, 

Tak więc kolekcja modeli nie zostanie ustawiona na nową, jeśli już ją posiada, ale wszystkie zdarzenia będą nadal poprawnie przekazywane ze wszystkich kolekcji, do których są dodawane.

odwrotnym jest również prawdą, wszelkie zdarzenia kolekcja nazywa się go przez powtarzanie wzorów w kolekcji,

for (i = 0, l = models.length; i < l; i++) { 
    ... 
    if (!options.silent) { 
     model.trigger('remove', model, this, options); 
    } 
    ... 
    } 
+2

Dodano lepszą obsługę modeli w wielu kolekcjach w tym zatwierdzeniu: https://github.com/jashkenas/backbone/commit/14000a8bb93b1b0876870b6211bf8fc5113abf37 –

Powiązane problemy