Backbone.js 如何使主干toJSON功能包括子模型和集合?
我有一些模型不仅包含基本的数据属性,而且它们可能有一个或两个包含另一个模型对象的属性 没关系,但现在我想打电话给你 myRootModel.toJSON() 我注意到在我试图调用toJSON()的模型中的其他模型上,它没有调用.toJSON 是否有方法重写主干模型.toJSON以递归方式遍历所有字段,无论它们是基本属性、子模型还是集合?如果不是,我可以在每个模型/集合中重写toJSON吗Backbone.js 如何使主干toJSON功能包括子模型和集合?,backbone.js,Backbone.js,我有一些模型不仅包含基本的数据属性,而且它们可能有一个或两个包含另一个模型对象的属性 没关系,但现在我想打电话给你 myRootModel.toJSON() 我注意到在我试图调用toJSON()的模型中的其他模型上,它没有调用.toJSON 是否有方法重写主干模型.toJSON以递归方式遍历所有字段,无论它们是基本属性、子模型还是集合?如果不是,我可以在每个模型/集合中重写toJSON吗 我知道主干关系,但我不想走这条路——我没有使用fetch/save,而是我们的API返回响应,我在模型解析函
我知道主干关系,但我不想走这条路——我没有使用fetch/save,而是我们的API返回响应,我在模型解析函数中调整响应,然后简单地调用新的MyRootModel(数据,{parse:true})。这里有一种方法可以实现这一点(可能还有另一种方法):
.调用
JSON.parse(JSON.stringify(model))
递归地解析带有所有子模型和子集合的模型。在主干网版本1.2.3上试用。因此,您实际上没有将任何内容转换为JSON(即字符串),您只是使用toJSON
将数据序列化为普通对象和数组?我确实使用了toJSON获取普通对象和数组,主要是为了使主干视图模板能够成功地迭代,而不会出现复杂情况;使用下划线模板,我可以在我的方法和集合上调用方法,但最近伦敦主干网会议的建议并不总是首先转换为普通对象(图)。这似乎起到了作用,谢谢-我很高兴在主干关系方法似乎能够很好地满足我当前的需要时,我没有使它过于复杂化。AFAIKtoJSON
不是递归的,因为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;
};