Sync 本质上是 Backbone 用于所有低级数据处理定制的通用挂钩。他们在同步文档中说了这么多:
Backbone.sync 是 Backbone 每次尝试读取或保存模型到服务器时调用的函数。默认情况下,它使用 jQuery.ajax 发出一个 RESTful JSON 请求并返回一个 jqXHR。您可以覆盖它以使用不同的持久性策略,例如 WebSockets、XML 传输或本地存储。
在 Rails 同步助手的情况下,作者甚至没有改变同步的基本性质(例如,改为本地存储)。相反,他的同步仍然“使用 jQuery.ajax 发出 JSON 请求并返回 jqXHR”,但它:
- 将 CSRF 令牌添加到请求中
- 添加一个可选的“paramRoot”属性,您可以使用它来指定模型的数据应该添加到请求中
你可以在这里看到#1:
beforeSend: function( xhr ) {
if (!options.noCSRF) {
var token = $('meta[name="csrf-token"]').attr('content');
if (token) xhr.setRequestHeader('X-CSRF-Token', token);
}
model.trigger('sync:start');
}
和#2这里:
if(model.paramRoot) {
data[model.paramRoot] = model.toJSON();
} else {
data = model.toJSON();
}
我无法确切地说出你为什么会得到
奇怪的效果(模型中的意外嵌套,空集合)
但我个人建议只编写自己的Backbone.sync
. 正如您所看到的,实现它的功能并不多,通过制作您自己的自定义功能,您可以从本质上理解它的工作原理(这很好,因为它对您的应用程序非常重要)。
或者,您可以完全避免整个Backbone.sync
覆盖方法。相反,您可以使用其他机制,例如 jQuery.ajaxSend()
来处理 #1 或您自己的自定义Model.toJSON
覆盖 #2。