Backbone.js 如何使用骨干关系从初始JSON自动创建多对多关系?

Backbone.js 如何使用骨干关系从初始JSON自动创建多对多关系?,backbone.js,many-to-many,backbone-relational,Backbone.js,Many To Many,Backbone Relational,这项研究假设,公司将在人已经创建之后添加 但是,如果人员数据来自服务器,并且已经有公司列表(公司ID),该怎么办 是否可以修改该示例,使以下代码(或smt.类似代码)成为可能: // somewhere before we have a collection of companies defined like this: // [{id: 1, name: 'ibm'}, {id: 2, name: 'apple'}] // and than we do: paul = new Person({

这项研究假设,公司将在人已经创建之后添加

但是,如果人员数据来自服务器,并且已经有公司列表(公司ID),该怎么办

是否可以修改该示例,使以下代码(或smt.类似代码)成为可能:

// somewhere before we have a collection of companies defined like this:
// [{id: 1, name: 'ibm'}, {id: 2, name: 'apple'}]
// and than we do:
paul = new Person({
    name: 'Paul',
    jobs: [1, 2]
})
paul.get('jobs').at(0).get('name') // 'ibm'
当我试图以一对多关系的方式实现这一点时,我失败了:

Companies = Backbone.Collection.extend({model: Company})
companies = new Companies([{id: 1, name: 'ibm'}, {id: 2, name: 'apple'}])

john = new Person({
    name: 'John',
    jobs: [1]
})

john.get('jobs').toJSON() // []
companies.get(1).get('employees').toJSON() // []

这里是你可以玩的小把戏:

你的主要问题是你试图按ID添加作业。你从未创建过任何作业对象,更不用说设置它们的ID了!你只创造了公司

添加作业的更好方法是使用一个
addJob()
函数,您可以给它一个公司ID(或公司),它会为您创建
Job
模型

以你为例

具体来说:

var Person = Backbone.RelationalModel.extend({
    relations: [{
        type: 'HasMany',
        key: 'jobs',
        relatedModel: Job,
        reverseRelation: {
            key: 'person'
            //includeInJSON: false //if you don't want to show person
        }
    }],
    addJob: function (company) {
        this.get('jobs').add(new Job({
            company: company
        }));
    }
});

paul.addJob(1);
paul.addJob(2);
工作完美。您可能还希望将职务上的反向关系的includeInJSON设置为false,以排除此人

[{
    "company": {
        "id": 1,
        "name": "ibm",
        "employees": [null]
    },
    "person": {
        "name": "Paul",
        "jobs": [null, {
            "company": {
                "id": 2,
                "name": "apple",
                "employees": [null]
            }
        }]
    }
}, {
    "company": {
        "id": 2,
        "name": "apple",
        "employees": [null]
    },
    "person": {
        "name": "Paul",
        "jobs": [{
            "company": {
                "id": 1,
                "name": "ibm",
                "employees": [null]
            }
        },
        null]
    }
}]