3

モデルを1つのバックボーンコレクションに複製し、追加してから別のコレクションに追加する必要があります。(つまり、新しいコレクションのすべてのモデルは一意である必要があり、元のコレクションのモデルとは関係がありません。)

これが私のコードです:

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

これはうまくいきません。collection1からcollection2にモデルを追加できるのは1回だけです。もう一度やろうとすると失敗します。したがって、どういうわけかバックボーンは重複を検出しています。

私が間違っていることについて何か提案はありますか?

(事前に)あなたの助けに感謝します

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 に答える