在我的应用程序中,我通过添加一个名为 fetchNew 的新方法解决了重置问题:
app.Collection = Backbone.Collection.extend({
// fetch list without overwriting existing objects (copied from fetch())
fetchNew: function(options) {
options = options || {};
var collection = this,
success = options.success;
options.success = function(resp, status, xhr) {
_(collection.parse(resp, xhr)).each(function(item) {
// added this conditional block
if (!collection.get(item.id)) {
collection.add(item, {silent:true});
}
});
if (!options.silent) {
collection.trigger('reset', collection, options);
}
if (success) success(collection, resp);
};
return (this.sync || Backbone.sync).call(this, 'read', this, options);
}
});
这与标准的fetch() 方法几乎相同,除了条件语句检查项目是否存在,并且默认使用add(),而不是reset。与简单地在 options 参数中传递 {add: true} 不同,它允许您检索可能与您已经加载的模型重叠的模型集 - 如果您尝试添加相同的模型两次,使用 {add: true} 将引发错误。
这应该可以解决您的缓存问题,假设您的集合已设置为您可以在options 中传递某种page 参数来告诉服务器要发回哪个选项页面。您可能希望在您的集合中添加某种数据结构来跟踪您已加载的页面,以避免执行不必要的请求,例如:
app.BigCollection = app.Collection.extend({
initialize: function() {
this.loadedPages = {};
},
loadPage: function(pageNumber) {
if (!this.loadedPages[pageNumber]) {
this.fetchNew({
page: pageNumber,
success: function(collection) {
collection.loadedPages[pageNumber] = true;
}
})
}
}
});