嵌套在模型中的集合的绑定

时间:2013-08-06 10:45:42

标签: backbone.js backbone-model backbone-collections

我脑子里有这个模型结构:

var app = app || {};

// Caratteristica
app.Attribute = Backbone.Model.extend({
    defaults: {     
        name: '',
        selected: false 
    }
});

app.Attributes = Backbone.Collection.extend({
    model: app.Attribute
});

// Tipo Caratteristica
app.AttributeCategory = Backbone.Model.extend({
    defaults: {     
        name: '', 
        attributes: new app.Attributes() 
    }
});

app.AttributeCategories = Backbone.Collection.extend({
    model: app.AttributeCategory, 
    url: '/ajax/attributes.cfm'
});

我在'/ ajax / attributes.cfm'中的API会给我一个这样的回复:

[
    {
        "id": "1",
        "name": "Type1",
        "attributes": [
            {
                "id": "1",
                "name": "Attribute1"
            },
            {
                "id": "2",
                "name": "Attribute2"
            },
            {
                "id": "3",
                "name": "Attribute3"
            }
        ]
    },
    {
        "id": "2",
        "name": "Type2",
        "attributes": [
            {
                "id": "1234",
                "name": "Attribute1234"
            },
            {
                "id": "2567",
                "name": "Attribute2567"
            }
        ]
    }
]

我的问题是:将这个json数据正确解析到我的嵌套数据结构中吗? 我的意思是我希望最终在我的 app.AttributeCategories 集合中有两个 app.AttributeCategory 项目。然后,这两个项目中的每一个都必须使用相应的 app.Attributes 集合填充其属性属性。

如果答案为否,我将如何覆盖 parse()函数来实现该结果?

2 个答案:

答案 0 :(得分:1)

我是这样做的:

// Tipo Caratteristica
app.AttributeCategory = Backbone.Model.extend({
    defaults: {     
        name: ''
    },
    initialize: function(options) {
        this.set('attributes', new app.Attributes(options.attributes));
        Backbone.Model.prototype.apply(this, arguments);
    }
});

但最好使用RationalModel来建立模型之间的关系

答案 1 :(得分:0)

您可以在AttributeCategory模型中的initialize方法中创建集合,如下所示:

app.AttributeCategory = Backbone.Model.extend({

    ...

    initialize: function () {
      this.set('attributes', new app.Attributes(this.get('attributes')));
    }
});