我有一个骨干集合。我想在集合中动态添加或删除一些模型。但是如果我使用 collection.set() 方法,那么它将首先删除所有元素,然后再次添加所有元素。
我想要做的是为那些真正新添加的人触发集合的添加事件,并为那些从以前的集合中删除的人触发删除事件。
这是一个示例 [http://jsfiddle.net/PkJCx/2/]
我有一个骨干集合。我想在集合中动态添加或删除一些模型。但是如果我使用 collection.set() 方法,那么它将首先删除所有元素,然后再次添加所有元素。
我想要做的是为那些真正新添加的人触发集合的添加事件,并为那些从以前的集合中删除的人触发删除事件。
这是一个示例 [http://jsfiddle.net/PkJCx/2/]
从文档
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 个是旧模型,然后将较新的模型合并到集合中。