坚持和在backbone.js集合中加载元数据

时间:2011-05-09 02:25:06

标签: javascript json collections backbone.js

我有一个使用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()(并尝试调用它的超类实现)更好的选择来实现我想要实现的目标?

由于

2 个答案:

答案 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];