Jen*_*ens 44 javascript backbone.js backbone.js-collections
我使用Backbone.js编写了一个模型/视图/集合.我的集合使用fetch方法从远程服务器加载模型.此集合所需的URL需要一个id:messages/{id}.但我发现没有干净的方法将选项传递给Collection.
backbone.js视图通过在构造上传递它来接受选项:view([options]),但是集合需要构建时的模型列表:collection([models]).
将参数/选项传递给此集合的"最干净"方法是什么?
缩短的代码:
var Messages = Backbone.Collection.extend({
model: Message,
url: 'http://url/messages/' + id
});
Run Code Online (Sandbox Code Playgroud)
nra*_*itz 108
@Paul的答案很好,但值得注意的是url属性可以是一个函数.在我看来(这只是意见,因为最终结果是相同的),代码更容易辨认,如果更详细,如果你设置id initialize并在函数中引用它:
var Messages = Backbone.Collection.extend({
initialize: function(models, options) {
this.id = options.id;
},
url: function() {
return '/messages/' + this.id;
},
model: Message,
});
var collection = new Messages([], { id: 2 });
collection.fetch();
Run Code Online (Sandbox Code Playgroud)
但是,为了确保 - 你不会在id这里与模特混淆id,是吗?@Paul的答案,以及我上面的代码,假设你有多个Messages集合,每个集合都有自己的id.如果API路径/messages/<id>实际上是指消息,而不是一组消息,那么您只需要在Collection中设置urlto /messages/,Backbone将自动/messages/<id>用于每个模型.
Pau*_*aul 23
您声明了url属性的方式,当浏览器最初加载javascript文件时,将确定一次值,并且'id'将是未定义的.
Backbone.Collection接受选项作为其构造函数中的第二个参数,因此您可以将id值作为选项传递,然后在集合的initialize函数中设置url值.
这是一个例子
var Messages = Backbone.Collection.extend({
initialize: function(models, options) {
this.url = 'http://url/messages/' + options.id;
},
model: Message,
});
var collection = new Messages([], { id: 2 });
collection.fetch();
Run Code Online (Sandbox Code Playgroud)