Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript BackboneJS:将更多项加载到集合中_Javascript_Model View Controller_Mongodb_Backbone.js - Fatal编程技术网

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

Javascript BackboneJS:将更多项加载到集合中,javascript,model-view-controller,mongodb,backbone.js,Javascript,Model View Controller,Mongodb,Backbone.js,在主干JS中,当我获取集合时,我应该获取整个集合还是它的一小部分 例如,我在mongoDB中收集的新闻提要可能包含1000个条目。当用户点击页面时,我只想向他们显示最新的10个项目,并选择“加载更多”。但是如果他们通过URLhttp://site.com/#/feed/:itemID我希望能够调出该项目的记录 1。我最初应该提取多少文档? 2。我如何通过id获取任何项目?1-您应该获取10个项目 向集合中添加页面参数,并让后端代码返回匹配的页面(10/页)/my_objects?第2页获取记录1

在主干JS中,当我获取集合时,我应该获取整个集合还是它的一小部分

例如,我在mongoDB中收集的新闻提要可能包含1000个条目。当用户点击页面时,我只想向他们显示最新的10个项目,并选择“加载更多”。但是如果他们通过URL
http://site.com/#/feed/:itemID
我希望能够调出该项目的记录

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


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

1-您应该获取10个项目

向集合中添加页面参数,并让后端代码返回匹配的页面(10/页)/my_objects?第2页获取记录10-20等

您这样做(未经测试):

或者直接更改URL

2-要按ID获取项目,请创建模型

object = new Model({id: 1})
去拿

object.fetch()

您可能不想只使用
Collection.fetch()
,因为客户端缓存不会给您带来好处,它会删除您已经从服务器加载的项目并重置集合。您可能需要使用自定义函数扩展
主干.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()
code中复制的,但它不会删除现有项,而是添加新项。您可能希望在服务器端实现一些东西,使用
选项
对象作为
Julien
建议传递您要加载的项目的参数,可能是页码(如果您想控制服务器上的页面大小)或开始-停止对(如果您想控制客户端上的页面大小).

在对我的集合调用fetch时,我最终使用了
{add:true}
语句。这可以防止集合被提取的结果替换,而是将结果附加到集合中。然后,我还使用
{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.好的,所以只需要将当前页面上的数据保存在主干集合中?2.要从后端获取模型,我必须首先使用相关ID创建模型,然后调用fetch。这会触发“添加”吗事件?或者就主干而言,模型不在集合中?您所说的“页面参数”是什么?这是构造“url”属性的函数吗?例如
url:function(){return x+“/”+y+“/”+z;
1.对。2.不,您必须将其添加到相关集合中。3.您可以使用url属性,但我认为在最新版本的主干网中,您可以通过fetch、refresh等向ajax调用发送选项。fetch({data:“your query here”})我正在尝试创建一个类似于Facebook的新闻源。新用户可以向源中添加项目并加载旧项目。这包括将新项目预先添加到源中并发送到服务器进行保存,将旧项目以十个为一组添加到源中。仍然有一点担心这是否可行。谢谢!这对我帮助很大!我我想知道这是否是做这件事的首选方法!其他选项似乎比需要做的工作更多。只需注意主干网0.9.10用户:fetch()不再接受
add:true
选项。但是,使用
{update:true,remove:false}
    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
            }
        });
    }