45

我使用 Backbone.js 编写了一个模型/视图/集合。我的收藏使用 fetch 方法从远程服务器加载模型。此集合所需的 url 需要一个 id,例如:messages/{id}。但我没有找到将选项传递给集合的干净方法。

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

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

缩短代码:

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

2 回答 2

109

@Paul 的回答很好,但同样值得注意的是该url属性可以是一个函数。initialize在我看来(这只是意见,因为最终结果是相同的),如果您在函数中设置 id并在函数中引用它,代码会更清晰一些,如果更冗长的话:

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

不过,只是为了确保-您不会将idhere 与 Model混淆id,是吗?@Paul 的回答和我上面的代码假设您有多个Messages集合,每个集合都有自己的 id。如果 API 路径/messages/<id>实际上指的是一条消息,而不是一组消息,那么您只需在 Collection中设置urlto ,Backbone 会自动为每个模型使用。/messages//messages/<id>

于 2011-12-11T16:51:58.893 回答
24

您声明 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();
于 2011-12-11T14:01:36.327 回答