8

我有一些模型不仅包含基本数据属性,而且它们可能有一个或两个包含另一个模型对象的属性。

这没关系,但现在我想打电话

myRootModel.toJSON()

而且我注意到它不会在我试图调用 toJSON() 的模型中的其他模型上调用 .toJSON。

有没有办法覆盖主干模型 .toJSON 以递归方式遍历所有字段,无论它们是基本属性、子模型还是集合?如果没有,我可以在每个模型/集合中覆盖 toJSON 吗?

我知道骨干关系,但我不想走那条路——我没有使用 fetch/save,而是我们的 API 返回我在模型解析函数中调整的响应并简单地调用 new MyRootModel(data, {解析:真})。

4

2 回答 2

16

这是您可以实现这样的事情的一种方法(可能还有另一种方法):

Backbone.Model.prototype.toJSON = function() {
  var json = _.clone(this.attributes);
  for(var attr in json) {
    if((json[attr] instanceof Backbone.Model) || (json[attr] instanceof Backbone.Collection)) {
      json[attr] = json[attr].toJSON();   
    }
  }
  return json;
};

http://jsfiddle.net/2Asjc/

于 2013-06-11T18:11:50.070 回答
5

调用JSON.parse(JSON.stringify(model))以递归方式解析具有所有子模型和子集合的模型。在主干版本 1.2.3 上尝试过。

于 2015-12-23T18:47:08.657 回答