4

文档中关于多对多关系的示例假设公司将在创建人之后添加。

但是,如果人员数据来自已经包含公司列表(公司 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() // []

这是你可以玩的小提琴:http: //jsfiddle.net/ymr5Z/

4

1 回答 1

0

您的主要问题是您尝试Jobs按 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);

完美运行。您可能还想为您在 Job 上的反向关系设置 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]
    }
}]
于 2013-02-08T01:55:57.037 回答