单个Backbone模型实例可以同时存在于两个集合中吗?

时间:2014-04-03 12:41:22

标签: backbone.js

据我所知,它的“this.collection”值只显示第一个集合,但这与Backbone兼容吗?或者它会自动从之前的集合中删除吗?

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

上面的代码有效,我只是想知道我是否通过这样做打破了任何事情(特别是与事件有关)。

1 个答案:

答案 0 :(得分:8)

TL; DR没有什么会破坏,你可以通过查看来源来验证这一点,addset(model, {add: true, remove: false, merge: false})的简写方法

如果您查看set method 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);
},

因此,如果模型的集合已经有一个集合,那么它们将不会被设置为新集合,但是所有事件仍将从添加到它的所有集合中正确传递。

反过来也是如此,通过迭代集合中的模型来调用任何集合事件,

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