【问题标题】:How to clone models from Backbone collection to another如何将模型从 Backbone 集合克隆到另一个集合
【发布时间】:2013-03-01 17:56:12
【问题描述】:

我需要克隆一个主干集合中的模型,然后将它们添加到另一个。 (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。

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

感谢(提前)您的帮助

【问题讨论】:

  • 为什么将 idAttribute 设置为 null?
  • collection2 = collection1.clone();?

标签: javascript jquery backbone.js underscore.js backbone.js-collections


【解决方案1】:

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

下划线是 Backbone 的硬依赖,因此您可以在集合的 JSON 表示上使用 _.omit 来过滤掉 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/

【讨论】:

  • 是的。还要记住,如果您没有预定义的 id 属性,则生成的“id”属性不会在您的 json 中。
【解决方案2】:

这是一个老问题,但 @nikoshr 和 this 的回答对我有帮助,所以我想补充一下我的贡献。

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

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);

【讨论】:

    猜你喜欢
    • 2014-12-18
    • 1970-01-01
    • 2018-12-13
    • 2014-08-31
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多