大家好!这可能是一个建筑禁忌,但我想得到一些关于如何解决这个问题的反馈。
假设我在两个或多个集合之间共享一个Model,并且从Model的上下文中,我想获取包含Collection 动态的某些实例字段。现在,我知道我可以通过model.collection
访问包含的Collection,并且我可以通过在Model构造函数中传入{collection: blahCollection}
选项来修改引用。但是,这对我目前的情况没有帮助,因为Backbone在Collection#set中进行了过早优化,只是合并了Model属性,但没有更新任何实例字段。
这是一个说明我的问题的例子。
var model, collection1, collection2;
model = new Backbone.Model();
collection1 = new Backbone.Collection();
collection1.title = 'collection1';
collection2 = new Backbone.Collection();
collection2.title = 'collection2';
// Add the Model to the first Collection
collection1.add(model);
console.log(model.collection.title); // prints 'collection1' as intended
collection2.add(model);
console.log(model.collection.title); // still prints 'collection1'
我已经想过几个解决方法,但是没有一个看起来特别好。
强制在每个集合中创建新模型。我必须为每个模型ID或类似的内容添加collection1_
或collection2_
前缀,但这对于更新来说非常糟糕。
在Collection#set中手动更改的每个Model上添加一个属性,这看起来同样可怕。
跟踪全局collectionTitle
,只要我们需要引用有效的收藏品,它就会发生变化...但这似乎是意大利面条簿记。
我想我的问题是:有什么方法可以让我最后从Model 的上下文中添加Model 的包含Collection?
任何建议都将不胜感激。谢谢!
答案 0 :(得分:0)
您可以覆盖Collection.add
或Collection.set
重新分配模型'集合以反映最新的add
操作。
像
这样的东西var C = Backbone.Collection.extend({
add: function() {
var ms = Backbone.Collection.prototype.add.apply(this, arguments);
_.each(ms, function(m) {
ms.collection = this;
}, this);
return ms;
}
});
model = new Backbone.Model();
collection1 = new C();
collection1.title = 'collection1';
collection2 = new C();
collection2.title = 'collection2';
collection1.add(model);
console.log(model.collection.title);
collection2.add(model);
console.log(model.collection.title);