BackboneJS:将更多项目加载到集合中

时间:2011-10-13 17:09:41

标签: javascript model-view-controller mongodb backbone.js

在Backbone JS中,当我获取一个集合时,我应该获取整个集合还是其中的一小部分?

例如,我在mongoDB中有新闻源集合,可能有1000个项目。当用户点击页面时,我只想向他们显示最新的10个项目,并选择“加载更多”。但是,如果他们通过网址http://site.com/#/feed/:itemID访问特定项目,我希望能够提取该项目的记录。

1。我最初应该提取多少文件?

2。我如何通过id获取任何项目?

3 个答案:

答案 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()