骨干模型toJSON奇怪地缓存自己

时间:2013-03-21 03:55:14

标签: backbone.js

我还是骨干的新手:

这是我的问题,我发现很难解释:

在初始化时有一个类似这样的模型:

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

有一个事件方法更新选择集合。 在事件触发后,我得到两个不同的结果,下面有两个代码:

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);

第一个日志显示更新的模型,但后者显示初始默认值。

为什么这样工作?

enter image description here

1 个答案:

答案 0 :(得分:0)

它们是两个不同的副本。您的QuestionModel有一个名为Selections的SelectionsCollection属性和一个Backbone属性,也称为Selections。我假设你想使用SelectionsCollection,该属性将不会与之保持同步。该属性是我认为无意中添加到模型中的原始json。

很难确切地说明如何修复它,因为您没有显示创建和获取这些模型和集合的代码。无论你在哪里选择JSON并且最初将reset放入集合中,你都可以将它从JSON中删除它和/或问题模型中的unset如果它已经存在......

这也会打印错误的原始数据:

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;
}

如果您执行此操作,并且希望将选择内容包含在QuestionModel的toJSON输出中,则还需要覆盖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;
}