2014-04-03 8 views
6

Capisco che il valore "this.collection" mostrerà solo la prima raccolta, ma è altrimenti compatibile con Backbone? O verrà automaticamente rimosso dalla raccolta precedente?Una singola istanza del modello Backbone può essere in due raccolte contemporaneamente?

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 

Il codice precedente funziona, mi chiedo solo se sto rompere nulla (soprattutto legati ad eventi) in questo modo.

+0

potrebbe descrivere si problema in dettaglio? – Evgeniy

+0

Certo, anche se lo chiedo in senso generale, non in un caso specifico. – AlexZ

+0

il modello di backbone fornisce un attributo di raccolta? – Saravanan

risposta

8

TL; DR Nulla si romperà, è possibile verificare questo guardando la fonte, add come metodo rapido per, set(model, {add: true, remove: false, merge: false})

Se si guarda la set method la parte in cui esso 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); 
}, 

Quindi la collezione dei modelli non sarà impostata su quella nuova se ne ha già una, ma tutti gli eventi verranno comunque passati correttamente da tutte le raccolte a cui è stato aggiunto.

Il vero anche il contrario, tutti gli eventi di raccolta sono chiamati mediante iterazione su modelli della collezione,

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

In questo commit è stato aggiunto un supporto migliore per i modelli in più raccolte: https://github.com/jashkenas/backbone/commit/14000a8bb93b1b0876870b6211bf8fc5113abf37 –

Problemi correlati