我有一个Backbone.js集合,我有一个模型ID数组,我想填充它。我知道我可以逐个获取这些对象,构建一个对象数组并将它们作为数组传递给Collection的构造函数。
我希望能够做的是将对象id数组作为初始数据传递给构造函数,并按照this获取Collection以获取它们,可能是批处理的。
可行?
答案 0 :(得分:10)
当你在Backbone.Collection上调用'fetch'时,它会调用Backbone.sync,默认情况下只是要求集合使用url。
因此,如果您的服务器响应:
/models/batch/?ids=1,2,3,4
您可以执行以下操作:
var MyCollection = Backbone.Collection.extend({
model: Model,
url: '/models',
initialize: function(models, options) {
ids = options.ids || [];
if (ids.length > 0) {
this.fetchByIds(ids);
}
},
fetchByIds: function(ids) {
// Save a reference to the existing url
var baseUrl = this.url;
// Assign our batch url to the 'url' property and call the server
this.url += '/?ids=' + ids.join(',');
this.fetch();
// Restore the 'url' property
this.url = baseUrl;
}
});
并像这样使用它:
var coll = new MyCollection({}, {ids: [1, 2, 3, 4]});
你必须在options参数中传递id,因为Backbone.Collection构造函数在调用'initialize'函数之前设置在第一个参数中传递的模型。
理论上,这应该有用(阅读:完全未经验证)。
答案 1 :(得分:7)
在初始页面加载时,您不应该使用fetch - 它应该使用此处描述的reset
进行自举:http://documentcloud.github.com/backbone/#FAQ-bootstrap。
从链接:
加载自举模式
当您的应用首次加载时,为了呈现页面,通常会有一组您知道自己需要的初始模型。一个更好的模式是将其数据引导到页面中,而不是触发额外的AJAX请求来获取它们。然后,您可以使用reset使用初始数据填充集合。在DocumentCloud中,在工作区的ERB模板中,我们按照以下几点做了一些事情:
<script>
Accounts.reset(<%= @accounts.to_json %>);
Projects.reset(<%= @projects.to_json(:collaborators => true) %>);
</script>
答案 2 :(得分:3)
您实际上也可以将url设置为函数。我只是重写fetch而不是fetchByIds: 另外,我认为baseUrl仅适用于Model,而不适用于Collection。我认为rulfzid有正确的想法,但我想我会这样做:
var MyCollection = Backbone.Collection.extend({
model: Model,
initialize: function(models, opts) {
if (options.ids) {
this.fetch(options.ids);
}
},
url: function() {
var url = '';
if (this.fetch_ids) {
// pass ids as you would a multi-select so the server will parse them into
// a list for you. if it's rails you'd do: id[]=
url = '/models?id=' + ids.join('&id=');
// clear out send_ids
this.fetch_ids = undefined;
} else {
url = '/models';
}
return url;
},
fetch: function(args) {
if (args.ids) {
this.fetch_ids = args.ids;
}
return Backbone.Model.prototype.fetch.call(this, args);
}
});
我认为它将功能保持在正确的“位置”,并且它允许更多的可重用性(即,您可以随时获取(list_of_ids)...您不需要新对象)