Backbone Collection Set方法删除现有元素,然后添加所有元素

时间:2013-08-06 16:57:12

标签: backbone.js backbone-collections

我有一个骨干集合。我想在集合中动态添加或删除一些模型。但是,如果我正在使用collection.set()方法,那么它将首先删除所有元素,然后它将再次添加所有元素。

我想要做的是为那些真正新添加的人触发添加集合事件,并为那些从之前集合中删除的人触发删除事件。

这是一个例子[http://jsfiddle.net/PkJCx/2/]

1 个答案:

答案 0 :(得分:1)

来自文档

  

使用set方法对集合执行“智能”更新   通过了模型列表。如果列表中的模型尚未出现在   收集它将被添加;如果模型已经在集合中   它的属性将被合并;如果集合包含任何   列表中没有的模型,它们将被删除。

向模型提供“idAttribute”也是一个好主意,这样集合就可以根据id识别出来。否则,集合将不知道模型是否是新模型。

因此,在设置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);
});

<强> Check Fiddle

它不会尝试删除其他2,但Backbone足够聪明,可以识别其中2个是旧模型,然后将新模型合并到集合中。