1

我对骨干还是陌生的:

这是我很难解释的问题:

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

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

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

为什么它会这样工作?

在此处输入图像描述

4

1 回答 1

0

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

很难确切地说如何修复它,因为您没有显示创建和获取这些模型和集合的代码。无论您将 Selections JSON 放在何处并最初reset将其放入集合中,您都可以将其从 JSON 中删除和/或将其从unsetQuestionModel 中删除(如果它已经存在)......

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

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 回答