Backbone Relational:具有2个相同类型集合的模型

时间:2013-04-19 20:04:06

标签: javascript backbone.js backbone-relational

我正在尝试使用相同类型的2“hasMany”关系创建骨干关系模型,但我收到错误:“无法创建关系=子项”(myReverseRelationName)“for model = child:already由关系=孩子“。这是应该被允许的东西,还是我做错了?感谢。

我创建了一个jsFiddle,所以你们可以自己看看: http://jsfiddle.net/Mu68f/5/

这是代码:

Animal = Backbone.RelationalModel.extend({
    urlRoot: '/animal/',
});

AnimalCollection = Backbone.Collection.extend({
    model: Animal
});

Zoo = Backbone.RelationalModel.extend({    
    relations: [
        {
            type: Backbone.HasMany,
            key: 'largeAnimals',
            relatedModel: Animal,
            collectionType: AnimalCollection,
            reverseRelation: {
                key: 'livesIn',
                includeInJSON: false
            }
        },
        {
            type: Backbone.HasMany,
            key: 'smallAnimals',
            relatedModel: Animal,
            collectionType: AnimalCollection,
            reverseRelation: {
                key: 'livesIn',
                includeInJSON: false
            }
        },
    ]
});

// initialize our zoo
var zoo = new Zoo({
    largeAnimals: [{name: "Big Bill"}],
    smallAnimals: [{name: "Pee Wee"}]
});
console.log(zoo);

1 个答案:

答案 0 :(得分:2)

问题是largeAnimals和smallAnimals都在“Animal”模型类中,但是没有对Zoo的不同引用。

就关联而言,如果模型(即动物)以两种不同的方式(小型和大型)属于另一种模型(Zoo),那么它应该具有两种不同类型的“外键”,它们指的是相关模型以两种不同的方式。

就简单性而言,我会选择将“大”或“小”作为属性添加到Animal类,而不是尝试以两种不同的方式将它与Zoo关联。

但是,如果您想将动物与动物园联系起来,请按以下步骤操作:

Animal = Backbone.RelationalModel.extend({
    urlRoot: '/animal/',
});

AnimalCollection = Backbone.Collection.extend({
    model: Animal
});

Zoo = Backbone.RelationalModel.extend({    
    relations: [
        {
            type: Backbone.HasMany,
            key: 'largeAnimals',
            relatedModel: Animal,
            collectionType: AnimalCollection,
            reverseRelation: {
                key: 'livesIn',
                includeInJSON: false
            }
        },
        {
            type: Backbone.HasMany,
            key: 'smallAnimals',
            relatedModel: Animal,
            collectionType: AnimalCollection,
            reverseRelation: {
                key: 'residesIn', // different key to refer to Zoo
                includeInJSON: false
            }
        },
    ]
});

如您所见,我给了smallAnimal一个不同类型的密钥来引用动物园。这也意味着当您从服务器获取smallAnimal时,smallAnimal个对象应该具有一个指向Zoo的属性residesIn