3

我正在试验 Rails-BackboneJS 堆栈,我在一些演示项目中看到了 Backbone.sync.rails 的使用,例如这种风格: https ://github.com/codebrew/backbone-rails/blob/master/vendor /assets/javascripts/backbone_rails_sync.js

据我了解,这会覆盖主干模型和集合的同步功能。然而,就我而言,我得到了一些奇怪的效果(模型中的意外嵌套,空集合)。

所以,我问自己,Rails 同步助手的目的是什么?何时(不)使用这些助手时需要考虑哪些重要事项?

谢谢!

4

1 回答 1

2

Sync 本质上是 Backbone 用于所有低级数据处理定制的通用挂钩。他们在同步文档中说了这么多:

Backbone.sync 是 Backbone 每次尝试读取或保存模型到服务器时调用的函数。默认情况下,它使用 jQuery.ajax 发出一个 RESTful JSON 请求并返回一个 jqXHR。您可以覆盖它以使用不同的持久性策略,例如 WebSockets、XML 传输或本地存储。

在 Rails 同步助手的情况下,作者甚至没有改变同步的基本性质(例如,改为本地存储)。相反,他的同步仍然“使用 jQuery.ajax 发出 JSON 请求并返回 jqXHR”,但它:

  1. 将 CSRF 令牌添加到请求中
  2. 添加一个可选的“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。

于 2013-04-26T05:33:33.097 回答