3

我需要克隆一个主干集合中的模型,然后将它们添加到另一个。(IOW新集合中的所有模型都需要是唯一的,并且与原始集合中的模型没有联系。)

这是我的代码:

collection1.each(function( model ) {
  var clone = new Backbone.Model( model.toJSON() );
  clone.set( this.idAttribute, null, { silent: true });
  collection2.add( clone );
});

这不太行。我只能将一个模型从 collection1 添加到 collection2 一次。如果我再次尝试这样做,它会失败。所以不知何故,Backbone 正在检测一个 dup。

关于我做错了什么有什么建议吗?

在此先感谢您的帮助

4

2 回答 2

1

在您提供的代码this.idAttribute中,可能不是您认为的那样,因此不会创建没有 ID 的模型,从而在您第二次复制模型时导致冲突。

下划线是 Backbone 的硬依赖,因此您可以使用_.omit集合的 JSON 表示来过滤掉 id。例如,

function copyCollection(collection1, collection2){
    var idAttribute = collection1.model.prototype.idAttribute;

    var data = _.map(
        collection1.toJSON(), 
        function(obj){ return _.omit(obj, idAttribute); }
    );

    collection2.add(data);
}

var c1 = new Backbone.Collection([
    {id: 1, name: "N1"},
    {id: 2, name: "N2"}
]);
var c2 = new Backbone.Collection();

copyCollection(c1, c2);
copyCollection(c1, c2);
console.log(c2.toJSON());

还有一个小提琴http://jsfiddle.net/jT59v/

于 2013-03-01T19:06:48.857 回答
0

这是一个老问题,但@nikoshr 和这个答案对我有帮助,所以我想添加我的贡献。

就我而言,我需要克隆一个包含嵌套集合的模型:

app.Collections.collection1 = Backbone.Collection.extend({
    model: app.Models.model1,
    clone: function() {
        return new this.constructor(_.map(this.models, function(model) { var clone = model.clone().unset('id', {silent: true}).unset('idAttribute', {silent: true}); return clone.set('collection2', clone.get('collection2').clone()); }));
    }
});

app.Collections.collection2 = Backbone.Collection.extend({
    model: app.Models.model2,
    clone: function() {
        return new this.constructor(_.map(this.models, function(model) { return model.clone().unset('id', {silent: true}).unset('idAttribute', {silent: true}); }));
    }
});

    var clone = this.model.clone().unset('id', {silent: true}).unset('idAttribute', {silent: true});
    clone.set('collection1', clone.get('collection1').clone());
    var copy = this.model.collection.add(clone, {parse: true});

所以在你的情况下,我猜你可以做这样的事情:

app.Collections.collection1 = Backbone.Collection.extend({
    clone: function() {
        return new this.constructor(_.map(this.models, function(model) { return model.clone().unset('idAttribute', {silent: true}); }));
    }
});

collection2.add(collection1.clone().models);
于 2015-02-06T22:33:02.347 回答