2011-05-09 64 views
14

我有一个情况使用backbone.js,我有一个模型集合和一些关于模型的附加信息。例如,假设我要返回一个金额列表:他们有一个与每个模型相关的数量。现在假设每个金额的单位总是相同的:说夸脱。然后JSON对象我从我的服务回报可能是这样的:在backbone.js集合中持久保存和加载元数据

{ 
    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()(并试图将其称为超类实现)更好的选择来实现我想要实现的目标?

感谢

回答

22

就个人而言,我想包内的另一个ModelCollection,然后覆盖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值传递给集合可能会阻止您能够绑定到这些元值。

+0

我知道这违背了你在你链接的其他后得到了答案,但集合不会拥有模型的所有属性,比如'parse',能够覆盖。如果集合需要元数据有意义,那么不妨反映在Backbone提供的对象结构中,而不是使用元上集合解决方案“IMO带外”。 – Stoive 2011-05-09 04:23:57

+0

这对我来说似乎很合理。关键在于能够重写模型对象以及集合上的parse/url/fetch。非常感谢。 – idbentley 2011-05-09 13:33:58

+6

现在不推荐使用Collection.refresh(),而是使用Collection.reset()。 – JMWhittaker 2012-07-09 18:06:52

0

此元数据不属于集合。它属于代码的名称或其他描述符。你的代码应该声明地知道它所拥有的集合只含有石英元素。自从url指向石英元素以来,它已经做到了。

var quartzCollection = new FooCollection(); 
quartzCollection.url = quartzurl; 
quartzCollection.fetch(); 

如果你真的需要得到这个数据为什么你不只是调用

_.uniq(quartzCollecion.pluck("unit"))[0];

+0

该单元在AJAX调用之前未知。我不使用'pluck',因为它会要求我的集合中的每个模型对象存储单元 - 这会导致响应的大小比仅将它作为元数据关联一次大。另外,执行像我怀疑的操作还有很大的开销。 – idbentley 2011-05-09 13:37:41

+0

@idbentley我虽然{dataPoints:...,unit}是模型。它是什么。只是dataPoints是一个集合。所以对待它就像在@Stoive答案中提到的那样。拔毛操作也不是那种花费。它只是将模型映射到单位。 – Raynos 2011-05-09 13:47:35

相关问题