在backbone.js集合中保留和加载元数据

idb*_*ley 14 javascript collections json backbone.js

我有一个使用backbone.js的情况,其中我有一组模型,以及一些关于模型的其他信息.例如,假设我正在返回金额列表:它们具有与每个模型相关联的数量.现在假设每个金额的单位总是相同的:比如夸脱.然后我从我的服务回来的json对象可能是这样的:

{
    dataPoints: [
         {quantity: 5 },
         {quantity: 10 },
         ...
    ],
    unit : quarts
 }
Run Code Online (Sandbox Code Playgroud)

现在骨干集合没有真正的机制来将这个元数据与集合本地关联,但是在这个问题中我建议:在集合上设置属性 -我可以使用.meta(property, [value])样式函数扩展集合的主干js - 这是一个好的解决方案 但是,我们自然希望能够从json响应中干净地检索这些数据,就像我们上面的那样.

Backbone.js为我们提供了parse(response)函数,它允许我们指定从url属性中提取集合的模型列表的位置.但是,我没有办法在不重载的情况下创建更智能的功能,fetch()这将删除已经可用的部分功能.

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

谢谢

Sto*_*ive 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;
    }
});
Run Code Online (Sandbox Code Playgroud)

Collection.refresh()调用使用新值更新模型.meta如先前建议的那样将自定义值传递到Collection可能会阻止您绑定到这些元值.

  • 现在不推荐使用Collection.refresh(),而是使用Collection.reset(). (6认同)