Javascript backbone.js缓存集合和刷新
我有一个可能包含数千个模型的集合。我有一个视图,显示一个表,每个页面有50行 现在我希望能够缓存我的数据,这样当用户加载表的第1页,然后单击第2页时,第1页(行#01-50)的数据将被缓存,这样当用户再次单击第1页时,主干就不必再次获取它 此外,我希望我的收藏能够在不执行重置的情况下从服务器刷新更新的数据,因为重置将删除收藏中的所有模型,包括我的应用程序中可能存在的现有模型的引用。是否可以从服务器获取数据,并仅在必要时通过比较现有数据和新到达的数据来更新或添加新模型?有一个选项{add:true},它将模型添加到集合中,而不是替换内容Javascript backbone.js缓存集合和刷新,javascript,caching,collections,backbone.js,refresh,Javascript,Caching,Collections,Backbone.js,Refresh,我有一个可能包含数千个模型的集合。我有一个视图,显示一个表,每个页面有50行 现在我希望能够缓存我的数据,这样当用户加载表的第1页,然后单击第2页时,第1页(行#01-50)的数据将被缓存,这样当用户再次单击第1页时,主干就不必再次获取它 此外,我希望我的收藏能够在不执行重置的情况下从服务器刷新更新的数据,因为重置将删除收藏中的所有模型,包括我的应用程序中可能存在的现有模型的引用。是否可以从服务器获取数据,并仅在必要时通过比较现有数据和新到达的数据来更新或添加新模型?有一个选项{add:true
myCollection.fetch({add:true})
因此,在第一个场景中,page2中的项目将添加到集合中
至于您的第二个场景,目前还没有内置的方法来实现这一点
这是你应该在你的应用程序中做的事情,而不是主干网的一部分
主干网在用于协作应用程序时似乎存在许多问题,其中其他用户可能正在更新您客户端的模型。我感觉Jeremy似乎专注于单用户应用程序,上面的票证讨论就是一个例子
在您的情况下,处理第二个场景的最简单方法是迭代集合并对每个模型调用fetch()
。但是,这对性能不是很好
为了更好地执行此操作,我认为您必须覆盖收集。_add,并沿着dalyons对此所做的步骤执行。在我的应用程序中,我通过添加一个名为
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()。与在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;
}
})
}
}
});
我成功地在主干网0.9.9内核中获得了update
。查看它,因为它正是您所需要的。从1.0.0版开始Collection#update
已重命名为Collection#set
。