Javascript 坚持,;在backbone.js集合中加载元数据

Javascript 坚持,;在backbone.js集合中加载元数据,javascript,json,collections,backbone.js,Javascript,Json,Collections,Backbone.js,在使用backbone.js时,我有一个模型集合,以及一些关于模型的附加信息。例如,假设我返回一个数量列表:它们有一个与每个模型关联的数量。现在假设每个数量的单位总是相同的:比如夸脱。然后,我从服务返回的json对象可能类似于: { dataPoints: [ {quantity: 5 }, {quantity: 10 }, ... ], unit : quarts } 现在主干集合没有真正的机制将此元数据与集合本

在使用backbone.js时,我有一个模型集合,以及一些关于模型的附加信息。例如,假设我返回一个数量列表:它们有一个与每个模型关联的数量。现在假设每个数量的单位总是相同的:比如夸脱。然后,我从服务返回的json对象可能类似于:

{
    dataPoints: [
         {quantity: 5 },
         {quantity: 10 },
         ...
    ],
    unit : quarts
 }
现在主干集合没有真正的机制将此元数据与集合本机关联,但在这个问题上,有人建议我:我可以使用
.meta(property,[value])
样式的函数扩展集合,这是一个很好的解决方案。然而,很自然地,我们希望能够从类似上面的json响应中干净地检索这些数据

Backbone.js为我们提供了
parse(response)
函数,它允许我们结合
url
属性指定从何处提取集合的模型列表。然而,据我所知,如果不重载
fetch()
,就无法生成更智能的函数,这将删除已经可用的部分功能

我的问题是:有没有比重载
fetch()
(并尝试调用它的超类实现)更好的选项来实现我想要实现的目标


谢谢

我个人,我会将
集合
包装在另一个
模型
中,然后覆盖
解析
,如下所示:

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()
调用使用新值更新模型。按照前面的建议向集合中传递自定义的
元数据可能会阻止您绑定到这些元数据。

此元数据不属于集合。它属于代码的名称或其他描述符。您的代码应该声明性地知道它所拥有的集合只包含石英元素。因为url指向quartz元素,所以它已经存在了

var quartzCollection = new FooCollection();
quartzCollection.url = quartzurl;
quartzCollection.fetch();
如果你真的需要这些数据,为什么不打电话呢


uq.uniq(quartzcollection.pull(“单位”))[0]

我知道这与你在链接的另一篇文章中得到的答案相矛盾,但是集合没有模型的所有属性,比如
parse
,可以覆盖。如果集合需要元数据有意义,那么最好在主干提供的对象结构中反映出来,而不是使用meta-on-Collection解决方案IMO“带外”。这对我来说非常合理。关键是能够覆盖模型对象和集合上的parse/url/fetch。非常感谢。现在不推荐使用Collection.refresh(),请改用Collection.reset()。在您的示例中,
CollectionContainer
的所有实例将共享同一个
dataPoints
实例,这可能并不总是可取的。要避免这种情况,请使用
initialize
方法中的
new dataPoints collection()
初始化
dataPoints
属性。在AJAX调用之前,该单元是未知的。我不使用
pulk
,因为它需要集合中的每个模型对象存储单元,这会导致响应的大小大于仅将其作为元数据关联一次。另外,我怀疑执行这样的操作会有很大的开销。@idbentley I虽然{dataPoints:…,unit}是模型。就是这样。只是数据点是一个集合。所以,像@Stoive answer中提到的那样对待它。而且拔毛手术也不是那个费用。它只是将模型映射到单位。