Backbone.js 如何使用骨干关系从初始JSON自动创建多对多关系?
这项研究假设,公司将在人已经创建之后添加 但是,如果人员数据来自服务器,并且已经有公司列表(公司ID),该怎么办 是否可以修改该示例,使以下代码(或smt.类似代码)成为可能: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({
// 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]
}
}]