0

我有一个非常复杂的主干模型结构。

  • m.Question:是一个基础问题。如果这是 C++,那将是一个“抽象”模型,因为只有它的子级会被实例化
  • m.NumericQuestion:扩展 m.Question
  • m.MultipleChoiceQuestion:扩展 m.Question
  • m......问题:你会得到很多问题类型
  • c.Questions:m.Question 孩子的集合

当被保存到数据库时,它们都有一个名为“type”的属性,它决定了它应该是什么模型。

当从服务器检索原始问题时,它们被放置在 Questions 集合(c.Questions)中。Backbone 应该解析来自服务器的响应并根据类型制作适当的模型。

所以我为 c.Questions 写了一个 _prepareModel() 函数。

但是当我执行 c.Questions.fetch() 时,我发现首先调用 Backbone.Collection.prototype._prepareModel (Backbone 关系具有的那个)!有没有办法可以事先拦截模型创建?

4

1 回答 1

1

覆盖模型的parse功能:http ://backbonejs.org/#Model-parse

您也可以为集合执行此操作:http: //backbonejs.org/#Collection-parse

像这样:

var MyModel = Backbone.Model.extend){
    parse: function(resp) {
        // your parse function returns the attributes that you want your new model to have
    }
});

对于一个集合,parse应该返回一个属性对象数组。

如果你想在获取后进一步操作属性,你可以做一些花哨的事情initialize,比如将一个属性放入另一个 Backbone 模型中,如下所示:

initialize: function() {
    this.set('attributeThatIsAnArray',new MyCollection(this.get('attributeThatIsAnArray')));
}

您可以查看另一个 Stack Overflow 问题以获取另一个示例: Converting JSON data to Backbone Model with child Collection

于 2013-01-24T21:17:22.823 回答