如何使Backbones toJSON功能包括子模型和集合?

Dev*_*Ltd 8 backbone.js

我有一些模型不仅包含基本数据属性,但它们可能有一个或两个属性来保存另一个模型对象.

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

myRootModel.toJSON()

而且我注意到它并没有在我试图调用toJSON()的模型中的其他模型上调用.toJSON.

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

我知道骨干关系,但我不想走这条路 - 我没有使用fetch/save,而是我们的API返回我在模型解析函数中调整的响应,只需调用新的MyRootModel(数据, {解析:真}).

Loa*_*oof 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;
};
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/2Asjc/.

  • AFAIK`toJSON`不是递归的,因为`JSON.stringify`将[自己调用`toJSON`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON_behavior)因为它遍历数据结构.从理论上讲,您可以使用`JSON.stringify`和`JSON.parse`来获取模型的完整序列化版本,这可能会更快,具体取决于浏览器中JSON的实现位置. (2认同)

ser*_*eyz 5

调用JSON.parse(JSON.stringify(model))以递归方式解析具有所有子模型和子集合的模型.试用Backbone版本1.2.3.