我有一个使用backbone.js的情况,其中我有一组模型,以及一些关于模型的其他信息。例如,假设我正在返回金额列表:它们具有与每个模型相关联的数量。现在假设每个金额的单位总是相同的:比如夸脱。然后我从我的服务回来的json对象可能是这样的:
{
dataPoints: [
{quantity: 5 },
{quantity: 10 },
...
],
unit : quarts
}
现在骨干集合没有真正的机制来将这个元数据本地关联到集合,但是在这个问题中我向我建议:Setting attributes on a collection - backbone js我可以使用.meta(property, [value])
样式扩展集合功能 - 这是一个很好的解决方案。然而,自然而言,我们希望能够从json响应中干净地检索这些数据,就像我们上面的那样。
Backbone.js为我们提供了parse(response)
函数,它允许我们指定从url
属性中提取集合的模型列表的位置。但是,我没有办法在不重载fetch()
的情况下创建更智能的函数,这将删除已经可用的部分功能。
我的问题是:有没有比重载fetch()
(并尝试调用它的超类实现)更好的选择来实现我想要实现的目标?
由于
答案 0 :(得分:22)
就个人而言,我会将Collection
包裹在另一个Model
内,然后覆盖parse
,如下所示:
var DataPointsCollection = Backbone.Collection.extend({ /* etc etc */ });
var CollectionContainer = Backbone.Model.extend({
defaults: {
dataPoints: new DataPointsCollection(),
unit: "quarts"
},
parse: function(obj) {
// update the inner collection
this.get("dataPoints").refresh(obj.dataPoints);
// this mightn't be necessary
delete obj.dataPoints;
return obj;
}
});
Collection.refresh()
调用使用新值更新模型。如先前建议的那样将自定义meta
值传递给Collection可能会阻止您绑定到这些元值。
答案 1 :(得分:0)
此元数据不属于该集合。它属于代码的名称或其他描述符。你的代码应该声明地知道它所拥有的集合只有石英元素。它已经存在,因为url指向石英元素。
var quartzCollection = new FooCollection();
quartzCollection.url = quartzurl;
quartzCollection.fetch();
如果你真的需要获取这些数据,为什么不打电话
_.uniq(quartzCollecion.pluck("unit"))[0];