Backbone.sync.rails等BackboneJS Sync助手的目的是什么?

时间:2013-04-21 13:57:11

标签: ruby-on-rails backbone.js

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

据我所知,这会覆盖Backbone模型和集合的同步功能。然而,在我的情况下,我得到了一些奇怪的效果(模型中的意外嵌套,空集合)。

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

谢谢!

1 个答案:

答案 0 :(得分:2)

Sync实际上是Backbone用于所有低级数据处理定制的通用钩子。他们在同步文档中也有同样的说法:

  

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

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

  1. 将CSRF令牌添加到请求
  2. 添加可选的“paramRoot”属性,您可以使用该属性指定应将模型的数据添加到请求中
  3. 你可以在这里看到#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。