我有一个 Backbone.js 集合,并且我有一个模型 ID 数组,我想填充它。我知道我可以一个一个地获取这些对象,构建一个对象数组并将它们作为数组传递给 Collection 的构造函数。
我想做的是将对象 id 的数组作为初始数据传递给构造函数,并根据this让 Collection 来获取它们,可能作为批处理。
可行吗?
我有一个 Backbone.js 集合,并且我有一个模型 ID 数组,我想填充它。我知道我可以一个一个地获取这些对象,构建一个对象数组并将它们作为数组传递给 Collection 的构造函数。
我想做的是将对象 id 的数组作为初始数据传递给构造函数,并根据this让 Collection 来获取它们,可能作为批处理。
可行吗?
当您在 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”函数之前设置第一个参数中传递的模型。
从理论上讲,这应该有效(阅读:完全未尝试过)。
在初始页面加载时,您不应该使用 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>
您实际上也可以将 url 设置为函数。我只是覆盖 fetch 而不是 fetchByIds:另外,我认为 baseUrl 仅适用于模型,而不适用于集合。我认为 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);
}
});
我认为它将功能保留在适当的“位置”,并且允许更多的可重用性(即,您可以随时 fetch(list_of_ids) ......您不需要新对象)