0

新しいコレクション (Choices) を作成するときに、含まれているモデル (MultipleChoiceQuestion) にリンクするプロパティ (例: _question) を設定したい

4

2 に答える 2

2

これを理解するのにかなりの時間がかかったので、将来誰かがこの問題を抱えた場合に備えて...ここに私が書いたコードがあります.

モデルとは異なり、コレクションの initialize() 関数は 2 つのパラメーターを受け入れることを発見しました。1 つ目はmodels(コレクションを初期化できるモデルのリストです)。2つ目はoptions(あなたが欲しいもの)です。しばらくの間、私のコレクションは 1 つのモデルから始まりましたが、その理由がわかりませんでした。options私はmodelsフィールドに私を渡していたことがわかりました。

含まれるモデル:

m.MultipleChoiceQuestion = Backbone.Model.extend({
    initialize: function(){
        //NULL as first parameter because we don't want models
        this.choices = new c.Choices(null, { 
            _question: this //this is referring to current question
        }); //choices Collection is this
    }
});

コレクション

c.Choices = Backbone.Collection.extend({
    initialize: function(models, options){
        this._question = options._question;
    },
    model: m.Choice
});
于 2012-12-27T19:46:21.423 に答える
0

私の最初の答えは技術的には機能しますが、コレクションをモデルに保存する(そして適切なOne-> Many、One-> One、Many->Oneの関係を作成する)プラグインがあることが実際にわかりました

https://github.com/PaulUithol/Backbone-relational

そのプラグインを使用して、親の質問を属性として保存します

m.MultipleChoiceQuestion = Backbone.RelationalModel.extend({
    relations: [{
        type: Backbone.HasMany,
        key: 'choices', //says to store the collection in the choices attribute
        relatedModel: m.Choice, //knows we are talking about the choices models
        includeInJSON: true, //when we do toJSON() on the Question we want to show serialize the choices fully
        reverseRelation: {
            key: 'question', //in the CHOICE object there will be an attribute called question which contains a reference to the question 
            includeInJSON: false //when we do .toJSON on a CHOICE we don't want to show the question object (or maybe we want to show the ID property in which case we set it to "id")
        }
    }],
    coolFunction: function () {
        this.get('choices').each(function(choice){
            choice.doSomethingChoicey();
        });
    }
});

したがって、選択モデルを使用している場合は、親の質問のすべてを完全に参照できます。

m.Choice = m.RelationalModel.extend({
    coolFunction: function(){
        this.get('question').doSomemethingQuestiony();
        var question_numer = this.get('question').get('question_number');
    }
});
于 2013-01-17T16:24:26.710 に答える