Collection是依附于基类的另一个数据集合类,它的功能是管理和存储由Model衍生的数据集合。可以从数据库的角度来看,一个实例化后的Model对象好像表中的一条记录,而一个实例化后的Collection对象则是一张数据集合表,可以在这表中进行一系列的增加、删除、修改、查询的操作,还可以与服务器进行数据同步,批量更新和获取数据。
通常有两种方法
-
自定义集合类,在实例化集合对象
var student = Backbone.Model.extend({ defaults : { Code : '', Name : '', Score : '' } }); var stuList = Backbone.Collection.extend({ model : student }); var stuModels = [{ Code : '101', Name : 'foo', Score : 500 },{ Code : '102', Name : 'bar', Score : 300 },{ Code : '103', Name : 'zhang', Score : 710 }]; var stus = new stuList(stuModels); for (var i = 0; i < stus.models.length; i++){ console.log(stus.models[i].toJSON()); }
-
直接实例化集合对象(更简洁和高效)
var student = Backbone.Model.extend({ defaults : { Code : '', Name : '', Score : '' } }); var stuModels = [{ Code : '101', Name : 'foo', Score : 500 },{ Code : '102', Name : 'bar', Score : 300 },{ Code : '103', Name : 'zhang', Score : 710 }]; var stuList = new Backbone.Collection(stuModels,{ model : student }); for (var i = 0; i < stus.models.length; i++){ console.log(stus.models[i].toJSON()); }
-
remove:从指定的集合对象中移除一个或多个模型对象
obj.remove(models,options)
-
pop:移除集合对象中最后一个模型对象
obj.pop(options)
-
shift:移除集合对象中首个模型对象
obj.shift(options)
-
add:向集合对象中指定的位置插入模型对象
obj.add(models,options)
-
push:向集合对象的尾部插入模型对象
obj.push(models,options)
-
unshift:向集合对象的头部插入模型对象
obj.unshift(models,options)
-
get:通过指定的ID号获取集合中的某一个模型对象
obj.get(id)
参数id为模型对象在产生时的唯一标志,也是用于与服务器保持同步的唯一编号。如果在构建模型对象类中,没有该属性,也可以通过
idAttribute属性值指定其他数字类型的属性为id标识。一旦某属性被指定为id标志,它将过滤重复的属性值,不能增加与该属性值相同的模型对象。 -
at:通过指定的索引号获取集合中的某一个模型对象
obj.at(index)
参数index为集合对象中模型数据的索引号,该索引号以0开始,最大值为obj.models.length -1
-
findWhere:查找与属性名称和属性值匹配的第一个模型对象
obj.findWhere(attrs)
参数attrs为
key/value形式的属性值对象。 -
where:查找与属性名称和属性值相匹配的第一个模型或多个模型对象
obj.where(attrs,first)
first参数是一个布尔类型的值,为true时,跟findWhere方法相同,为false时,返回的是一个数组集合。
obj.sort(options)options参数为排序过程中的配置对象,在该对象中可以设置slient等属性。在集合对象调用sort方法之前,必须在实例化集合对象时,添加一个名为comparator的方法,如果不添加该方法,调用sort则提示"Cannot sort a set without a comparator"异常信息。
注意:
-
执行效率,每一次的集合模型对象变化都会引发重新排序,如果展示的集合对象数量很大,这种排序时的执行效率将会很慢,建议这个方法不针对大量模型对象。
-
屏蔽其他按位置插入或删除模型对象的功能。
var student = Backbone.Model.extend({
defaults : {
Code : '',
Name : '',
Score : ''
}
});
var stuModels = [{
Code : '101',
Name : 'foo',
Score : 500
},{
Code : '102',
Name : 'bar',
Score : 300
},{
Code : '103',
Name : 'zhang',
Score : 710
}];
var stus = new Backbone.Collection(stuModels,{
model : student,
comparator : function (m1,m2){
var intComp = m1.get('Score') > m2.get('Score');
return intComp ? 0 : 1;
}
});
stus.sort();
for (var i = 0; i < stus.models.length; i++){
console.log(stus.models[i].toJSON());
}-
fetch:从服务器接口获取集合对象初始化的数据
obj.fetch(options)
options为与服务器进行交互过程的配置对象,在该对象中可以添加success方法,表示当与服务器交互成功后将会调用该方法。此外,如果设置reset为true,在调用自定义的success方法时,还会触发集合对象reset事件。
var student = Backbone.Model.extend({ defaults : { Code : '', Name : '', Score : 0 } }); var stuList = Backbone.Collection.extend({ initialize : function (){ this.on('reset',function (render){ //进行某些操作 }) }, model : student, url : 'fetch' }); var stus = new stuList(); stus.fetch({ reset : true, success : function(collection,resp,options){ //执行某些操作 } })
-
create:将创建好的集合对象中的全部对象数据发送到服务器,完成数据同步的功能
obj.create(model,options)
-
model参数为发送给服务器的模型对象,参数options则为发送时的方法配置对象,可以配置success方法和wait、slient属性等。
-
在集合对象调用create方法过程中,会使用
POST和PUT两种Request Method方法向服务器发送数据,前者表示创建模型对象,后者则为修改模型对象。内部通过isNew方法检测数据是否是新建还是更新。 -
集合对象调用create方法后,如果绑定集合对象的
add事件,还会自动触发该事件。
两个配置属性的详解
-
wait : true
表示只有当客户端与服务器端完成数据同步之后,才会将同步的模型对象数据添加到集合对象中。如果异常,不会触发绑定的集合对象add事件。
-
slient : true
表示静默式同步,不需要客户端与服务器数据同步成功,就可以向集合对象添加模型数据。
-