在Backbone JS中,当我获取一个集合时,我应该获取整个集合还是其中的一小部分?
例如,我在mongoDB中有新闻源集合,可能有1000个项目。当用户点击页面时,我只想向他们显示最新的10个项目,并选择“加载更多”。但是,如果他们通过网址http://site.com/#/feed/:itemID
访问特定项目,我希望能够提取该项目的记录。
1。我最初应该提取多少文件?
2。我如何通过id获取任何项目?
答案 0 :(得分:13)
在我的集合上调用fetch时,我最终使用了{add: true}
语句。这可以防止集合被fetch的结果替换,而是将结果附加到集合中。然后我还使用{data: {skip: amountOfItemsInCollectionAlready }
传递了'skip'数量,这在服务器端用于从数据库中获取正确的一批项目。
我的最终获取方法如下所示:
loadMore: function(e){
this.collection.fetch({
add: true,// this adds to collection instead of replacing
data:{// this is optional params to be sent with request
skip: this.collection.length// skip the number of items already in the collection
}
});
}
答案 1 :(得分:5)
您可能不想只使用Collection.fetch()
,因为您无法获得客户端缓存的好处 - 它会删除您已从服务器加载的项目并重置集合。您可能需要使用自定义函数扩展Backbone.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) {
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
对象,Julien
建议传递您要加载的项目的参数,可能是页码(如果您想要控制服务器上的页面大小)或启动 - 停止对(如果要在客户端上控制它)。
答案 2 :(得分:3)
1 - 你应该拿10个
向集合中添加页面参数,并使后端代码返回匹配的页面(10 /页)。 / my_objects?page = 2获取记录10-20等。
你这样做(未经测试):
collection.fetch({data: {page:2}})
或者您直接更改网址
2 - 要按ID获取项目,请创建模型
object = new Model({id: 1})
并获取它
object.fetch()