2011-05-10 54 views
16

这似乎是一个明显的,但我有点想念它...backbone.js collection get vars

你如何发送options和backbone.js集合fetch()?

或者从更广泛的角度来看:我在服务器上有一个很大的数据集,在这种情况下,我想通过一个集合来访问这些数据集。看到可能有成千上万条消息,我不想一次性获取并存储所有消息,因此我的收藏必须至少了解限制和偏移量。更不用说查询过滤或排序的列表。

即使是处理这个问题的方法,骨干集合是什么?

干杯

回答

31

我一直在搞乱骨干几天,我不得不几乎立即处理这个问题,我看着这个解决方案,但我发现它笨重。在阅读了更多的骨干文档后,我发现你实际上可以覆盖fetch()方法中的任何jQuery.ajax选项。因此,例如

Posts = Backbone.Collections.extend({ 
    model: Post, 
    url: '/posts' 
}); 

现在,当你想调用fetch时,只需发送你想要的任何参数。例如

var posts = new Posts(); 
posts.fetch({ data: { page: 3, pagesize: 10, sort: 'asc' } }); 

这将产生以下请求:

http://yourdomain/posts?page=3&pagesize=10&sort=asc 

不管怎样,我知道你已经接受了答案,但希望这会帮助别人。

0

覆盖您的收藏的 “网址” 功能,并添加参数(?PARAM = XYZ)。

也可以使用fetch的options参数,因为它是传递给最终jQuery ajax调用的参数。所以如果你添加一个“数据”参数,它将被使用。

1

您可以将一个ID添加到服务器可用于选择数据发送的URL。例如。

var EventsCollection = Backbone.Collection.extend({ 

     model: Events, 

    }); 

    var eventCollection = new EventsCollection(); 
    eventsCollection.url = 'foo?offset=10&limit=20'; 
    eventsCollection.fetch(); 
6

考虑一下这段代码,当你实例化你的集合时,你传递偏移量,限制或排序的首选项。如果没有提供首选项,初始化将采用默认值。然后url函数将这些附加到对服务器的调用中。之后,在处理来自服务器的响应时,您将不得不更新这些值(可能只是偏移量)。

MessageList = Backbone.Collection.extend({ 

    initialize: function(models, options) { 
     options || (options = {}); 
     this.offset = options.offset || 0; 
     this.limit = options.limit || MessageList.DEFAULT_LIMIT; 
     this.sortBy = options.sortBy || MessageList.DEFAULT_SORTBY; 
    }, 

    url: function() { 
     return '/messages?' + 
       'offset=' + encodeURIComponent(this.offset) + '&' + 
       'limit=' + encodeURIComponent(this.limit) + '&' + 
       'sort_by=' + encodeURIComponent(this.sortBy); 
    }, 

    parse: function(response) { 
     // Parse models 
     // Parse offset, limit, sort by, etc 
    } 

}, { 

    DEFAULT_LIMIT: 100, 
    DEFAULT_SORTBY: 'name_asc' 

});