为什么在使用额外数据保存Backbone模型时需要使用JSON.stringify:{}参数?

时间:2013-11-08 18:02:58

标签: javascript json backbone.js

我保存了一个Backbone模型,我正在使用的API需要' full = true'为了正常工作也要通过。所以例如要保存它需要做:

myModel.save(null, { data: { full: true} });

但是,如果我这样做它不起作用,如果我查看Chrome开发工具中的网络标签,我会看到请求的[object Object]:

enter image description here

另一方面,如果我使用JSON.stringify它似乎工作正常:

myModel.save(null, { data: JSON.stringify({ full: true}) });

enter image description here

当然我每次都可以使用JSON.stringify,但我真的很想知道为什么会这样,所以我可以创建一个自定义Backbone.sync ......

1 个答案:

答案 0 :(得分:3)

我最终搞清楚了,如果有人遇到同样的问题,我会在这里回答我自己的问题。

在通过Backbone ajax发送之前,数据对象最终需要是一个字符串。因为在第一种情况下我没有这样做,所以它通过原生的.toString()方法被强制转换为字符串。例如:

var obj = {};
obj.toString(); //[object Object]

这对API毫无意义。

在第二种情况下,因为我对数据对象进行了字符串化,所以它运行正常。

Backbone.sync使用模型属性对数据对象进行字符串化,但如果传递显式数据对象则会覆盖它:

if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
  params.contentType = 'application/json';
  params.data = JSON.stringify(options.attrs || model.toJSON(options));
}