我强烈建议不要在视图层执行此操作。您将在视图中添加大量代码,并且最终会在多个视图之间复制大量代码(一个用于显示数据,一个用于页面列表和计数,一个用于... )。
相反,使用装饰器模式来构建一个知道如何处理的集合。我这样做是为了过滤、排序和分页数据,效果很好。
例如,这是我设置过滤的方式(在 JSFdiddle 中运行:http: //jsfiddle.net/derickbailey/vm7wK/)
function FilteredCollection(original){
var filtered = Object.create(original);
filtered.filter = function(criteria){
var items;
if (criteria){
items = original.where(criteria);
} else {
items = original.models;
}
filtered.reset(items);
};
return filtered;
}
var stuff = new Backbone.Collection();
var filtered = FilteredCollection(stuff);
var view = Backbone.View.extend({
initialize: function(){
this.collection.on("reset", this.render, this);
},
render: function(){
var result = this.collection.map(function(item){ return item.get("foo"); });
this.$el.html(result.join(","));
}
});
在您的情况下,您不会像这样进行过滤......但是分页和流式传输的想法是相同的。
您将在“PagingCollection”中跟踪您所在的页面,然后当您的原始集合被重置或添加了新数据时,PagingCollection 函数将重新计算最终 pagedCollection 实例中需要哪些数据,并且使用您需要的数据重置该集合。
像这样的东西(虽然这是未经测试和不完整的。你需要填写一些细节并根据你的应用程序的需要充实它)
function PagingCollection(original){
var paged = Object.create(original);
paged.currentPage = 0;
paged.totalPages = 0;
paged.pageSize = 0;
paged.setPageSize = function(size){
paged.pageSize = size;
};
original.on("reset", function(){
paged.currentPage = 0;
paged.totalPages = original.length / paged.pageSize;
// get the models you need from "original" and then
// call paged.reset(models) with that list
});
original.on("add", function(){
paged.currentPage = 0;
paged.totalPages = original.length / paged.pageSize;
// get the models you need from "original" and then
// call paged.reset(models) with that list
});
return paged;
}
使用分页信息装饰集合后,将分页集合传递给 CollectionView 或 CompositeView 实例。这些将正确呈现您传递给它的集合中找到的模型。
关于 CollectionView 与 CompositeView ... CompositeView 是一个 CollectionView(它直接从它扩展),它允许您围绕集合呈现模型/模板。这是主要的区别......它们都处理集合,并从该集合中呈现视图列表。