1

私はまだバックボーンに不慣れです:

これが私が説明するのが難しいと思う私の問題です:

初期化には、次のようなモデルがあります。

Model:
 {
  Id:xxx,
  Questions:
           [ 
             {
              Id: "yy", 
              Selections: 
                        [ 
                         {OptionId:"aaa"},
                         ...,
                         {OptionId:"zzz"} 
                        ]
             }, 
           ....
           ]
 } 

選択コレクションを更新するイベントメソッドがあります。イベントがトリガーされた後、以下の2つのコードで2つの異なる結果が得られました。

window.pkg.Questions.get(this.Id).Selections.reset(selectedoptions);

console.log(window.pkg.Questions.get(this.Id).Selections.toJSON());        
console.log(window.pkg.Questions.get(this.Id).toJSON().Selections);

最初のログには更新されたモデルが表示されますが、後者には初期のデフォルト値が表示されます。

なぜこのように機能しているのですか?

ここに画像の説明を入力してください

4

1 に答える 1

0

それらは2つの異なるコピーです。QuestionModelには、Selectionsと呼ばれるSelectionsCollectionプロパティと、Selectionsとも呼ばれるBackbone属性があります。SelectionsCollectionを使用したいとしますが、属性はそれと同期しません。この属性は、誤ってモデルに追加されたと思われる元のjsonです。

これらのモデルとコレクションを作成およびフェッチするコードを表示しなかったため、修正方法を正確に言うのは困難です。Selections JSONを取得し、最初resetにコレクションに追加する場合は常に、JSONから削除したり、unsetすでに存在する場合はQuestionModelで削除したりできます。

これにより、間違った元のデータも印刷されます。

console.log(window.pkg.Questions.get(this.Id).get('Selections')); // print original JSON

あなたはQuestionModelのでそれを取り除くことができますparse

parse: function(data) {
    // removing Selections from data here will prevent
    // it from being added as an attribute.
    delete data.Selections; 
    return data;
}

これを行い、SelectionsをtoJSONQuestionModelの出力に含めたい場合は、もオーバーライドする必要がありますtoJSON

toJSON: function() {
    // get json for Question
    var json = Backbone.Model.prototype.toJSON.call(this);
    // add updated json for selections
    json.Selections = this.Selections.toJSON();

    return json;
}
于 2013-03-21T05:41:27.810 に答える