Backbone.js集合选项
我用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 });
@保罗的答案是好的,但也值得注意的是, 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();
只是为了确定,但是 – 你不是在模型id
这里混淆id
,是吗? @ Paul的回答,以及我上面的代码,假设你有多个Messages
集合,每个集合都有自己的id。 如果APIpath/messages/<id>
实际上是指消息 ,而不是一组消息,那么您只需将url
设置为Collection中的/messages/
,Backbone就会自动使用/messages/<id>
每个模型。
您声明的url属性的方式,当浏览器最初加载JavaScript文件时,该值将被确定一次,并且'id'将是未定义的。
Backbone.Collection接受选项作为构造函数中的第二个参数,所以你可以传递id值作为选项,然后在集合的初始化函数中设置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();