2

バックボーン コレクションがあります。コレクション内でいくつかのモデルを動的に追加または削除したいと考えています。しかし、collection.set() メソッドを使用している場合、最初にすべての要素を削除してから、すべての要素を再度追加します。

私がやりたいのは、本当に新しく追加されたものに対してコレクションの追加イベントをトリガーし、以前のコレクションから削除されたものに対して削除イベントをトリガーすることです。

ここに例があります[http://jsfiddle.net/PkJCx/2/]

4

1 に答える 1

1

ドキュメントから

set メソッドは、渡されたモデルのリストを使用して、コレクションの「スマートな」更新を実行します。リスト内のモデルがまだコレクションにない場合は、追加されます。モデルがすでにコレクションにある場合、その属性はマージされます。リストにないモデルがコレクションに含まれている場合、それらは削除されます。

コレクションがIDに基づいてそれを識別するように、モデルに「idAttribute」を提供することも良い考えです。そうしないと、コレクションはモデルが新しいモデルかどうかを認識できません。

したがって、id を設定して を使用するとset、 がスマート アップデートを実行することがわかります。

$(function () {
    var MyModel = Backbone.Model.extend({ 
        // This attribute should be set as a default
        defaults: {
            Name: ''
        },
        // Set the id attribute so that the collection 
        // know that it is the old model
        idAttribute: 'id'

    });

    var Coll = Backbone.Collection.extend({
        model: MyModel
    });

    var models = [{
        Name: 'A',
        id: 1
    }, {
        Name: 'B',
        id: 2
    }];

    var collection = new Coll(models);

    collection.bind('add', function (model) {
        alert('addb')
    });
    collection.bind('remove', function () {
        alert('add')
    });


    models = [{
        Name: 'A',
        id :1
    }, {
        Name: 'B',
        id: 2
    }, {
        Name: 'C',
        id: 3
    }];
    collection.add(models);
});

フィドルをチェック

残りの 2 つを削除しようとはしませんが、Backbone は、そのうちの 2 つが古いモデルであることを識別し、新しいモデルをコレクションにマージするのに十分なほどスマートです。

于 2013-08-06T17:30:40.580 に答える