4

多対多の関係に関するドキュメントの例では、人物が作成された後に会社が追加されることを想定しています。

しかし、すでに企業のリスト (企業 ID) を含むサーバーから個人データが取得されている場合はどうなるでしょうか。

次のコード (または同様のコード) が可能になるように例を変更することは可能ですか?

// 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'

1対多の関係で行うのと同じ方法でこれを達成しようとすると、失敗します:

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 に答える