1

我正在保存一个 Backbone 模型,并且我正在使用的 API 也需要传递 'full=true' 才能正常工作。所以例如保存它需要做:

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

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

在此处输入图像描述

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

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

在此处输入图像描述

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

4

1 回答 1

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));
}
于 2013-11-13T18:10:12.817 回答