Backbone:集合之间的共享模型 - 更新集合参考?

时间:2015-03-20 15:45:51

标签: backbone.js collections model

大家好!这可能是一个建筑禁忌,但我想得到一些关于如何解决这个问题的反馈。

假设我在两个或多个集合之间共享一个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'

我已经想过几个解决方法,但是没有一个看起来特别好。

  1. 强制在每个集合中创建新模型。我必须为每个模型ID或类似的内容添加collection1_collection2_前缀,但这对于更新来说非常糟糕。

  2. 在Collection#set中手动更改的每个Model上添加一个属性,这看起来同样可怕。

  3. 跟踪全局collectionTitle,只要我们需要引用有效的收藏品,它就会发生变化...但这似乎是意大利面条簿记。

  4. 我想我的问题是:有什么方法可以让我最后从Model 的上下文中添加Model 的包含Collection?

    任何建议都将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以覆盖Collection.addCollection.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);

演示http://jsfiddle.net/nikoshr/frkc3a51/