Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 如何使主干toJSON功能包括子模型和集合?_Backbone.js - Fatal编程技术网

Backbone.js 如何使主干toJSON功能包括子模型和集合?

Backbone.js 如何使主干toJSON功能包括子模型和集合?,backbone.js,Backbone.js,我有一些模型不仅包含基本的数据属性,而且它们可能有一个或两个包含另一个模型对象的属性 没关系,但现在我想打电话给你 myRootModel.toJSON() 我注意到在我试图调用toJSON()的模型中的其他模型上,它没有调用.toJSON 是否有方法重写主干模型.toJSON以递归方式遍历所有字段,无论它们是基本属性、子模型还是集合?如果不是,我可以在每个模型/集合中重写toJSON吗 我知道主干关系,但我不想走这条路——我没有使用fetch/save,而是我们的API返回响应,我在模型解析函

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

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

myRootModel.toJSON()

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

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


我知道主干关系,但我不想走这条路——我没有使用fetch/save,而是我们的API返回响应,我在模型解析函数中调整响应,然后简单地调用新的MyRootModel(数据,{parse:true})。

这里有一种方法可以实现这一点(可能还有另一种方法):


.

调用
JSON.parse(JSON.stringify(model))
递归地解析带有所有子模型和子集合的模型。在主干网版本1.2.3上试用。

因此,您实际上没有将任何内容转换为JSON(即字符串),您只是使用
toJSON
将数据序列化为普通对象和数组?我确实使用了toJSON获取普通对象和数组,主要是为了使主干视图模板能够成功地迭代,而不会出现复杂情况;使用下划线模板,我可以在我的方法和集合上调用方法,但最近伦敦主干网会议的建议并不总是首先转换为普通对象(图)。这似乎起到了作用,谢谢-我很高兴在主干关系方法似乎能够很好地满足我当前的需要时,我没有使它过于复杂化。AFAIK
toJSON
不是递归的,因为
JSON.stringify
将在数据结构中运行。理论上,您可以使用
JSON.stringify
JSON.parse
来获得模型的完整序列化版本,这可能会更快,这取决于JSON在浏览器中的实现位置。@muistooshort您不是想得太多了吗?主干网的
toJSON
版本不是关于字符串化和解析,而是简单地返回属性集。也许我错过了什么,但是…也许。主干网选择了
toJSON
名称,因为
JSON.stringify
将在将内容序列化为JSON时使用该方法,因此
JSON.stringify(some_model)
将调用
some_model.toJSON()
。因此,如果您正在调用
m.toJSON()
JSON.stringify
生成数据,那么
toJSON
将在
m
属性中的任何内容上被调用,这样主干就不必这样做。如果您正在调用
toJSON
为视图准备数据,那么您可以自己处理。这是将
toJSON
用于两个完全不同的目的的另一个不幸问题。至少这是我的想法。到目前为止,你正在使用lodash/下划线进行克隆,实际上没有任何东西阻止你使用它进行散列循环。对于Chrome 49,我强烈建议不要使用这种方法,因为现在看来,这会给你
{attributes:{…},changed:{…}
在Chrome 63中工作得很好。这是我遇到的最简单的解决方案。
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;
};