2

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

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

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

4

1 回答 1

1

从文档

set 方法使用传递的模型列表对集合执行“智能”更新。如果列表中的模型尚未在集合中,它将被添加;如果模型已经在集合中,它的属性将被合并;如果集合包含列表中不存在的任何模型,它们将被删除。

为模型提供“idAttribute”也是一个好主意,以便集合根据 id 识别它。否则,该集合将不知道该模型是否是新模型。

所以在设置 id 和 using 之后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 回答