2011-12-11 120 views
44

我已经使用Backbone.js编写了模型/视图/集合。我的集合使用fetch方法从远程服务器加载模型。这个集合所需的url需要一个id:messages/{id}。但我发现没有干净的方式将选项传递给Collection。Backbone.js集合选项

backbone.js视图通过在构造上传递选项来接受选项:view([options]),但集合需要构造时的模型列表:collection([models])。

将参数/选项传递给此集合的“最干净”方式是什么?

缩短代码:

var Messages = Backbone.Collection.extend({ 
model: Message, 
    url: 'http://url/messages/' + id 
}); 
+4

也许使用相对网址是一个更好的主意呢? – malletjo

回答

107

@保罗的回答是不错的,但它也是值得注意的是,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(); 

尽管如此 - 您并没有将idid混淆,对吗? @ Paul的回答,以及我上面的代码,假设您有多个Messages集合,每个集合都有自己的id。如果API路径/messages/<id>实际上是指消息,而不是一组消息,那么您只需在集合中将url设置为/messages/,并且骨干将自动为每个模型使用/messages/<id>

+3

谢谢'尼克'这样一个简单明了的例子。我希望我能看到你的答案,我会保存一天....再次感谢。 – Shubh

+0

是的,这对我而言是未定义的。下面的答案是有效的。 –

23

你有url属性声明的方式,该值将被一次当浏览器最初加载javascript文件确定,和“身份证”将是不确定的。

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