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();