我正在尝试使用Rails-BackboneJS堆栈,我在一些演示项目中看到Backbone.sync.rails的使用,例如以这种方式:https://github.com/codebrew/backbone-rails/blob/master/vendor/assets/javascripts/backbone_rails_sync.js
据我所知,这会覆盖Backbone模型和集合的同步功能。然而,在我的情况下,我得到了一些奇怪的效果(模型中的意外嵌套,空集合)。
所以,我问自己,Rails同步助手的目的是什么? (不)使用这些助手时需要考虑的重要事项是什么?
谢谢!
答案 0 :(得分:2)
Sync实际上是Backbone用于所有低级数据处理定制的通用钩子。他们在同步文档中也有同样的说法:
Backbone.sync是Backbone每次尝试读取模型或将模型保存到服务器时调用的函数。默认情况下,它使用jQuery.ajax发出RESTful JSON请求并返回jqXHR。您可以覆盖它以使用不同的持久性策略,例如WebSockets,XML传输或本地存储。
在Rails同步帮助器的情况下,作者甚至没有改变同步的基本性质(例如,到本地存储)。相反,他的同步仍然“使用jQuery.ajax发出JSON请求并返回一个jqXHR”,但它:
你可以在这里看到#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。