如何覆盖Backbone.sync?

时间:2011-02-23 20:16:09

标签: javascript backbone.js

我正在尝试Backbone.js,我正在尝试的其中一件事就是调用远程API,所以我需要能够覆盖Backbone.sync,因为我理解{{3} }。

在文档本身没有一个如何做到这一点的例子,并且似乎没有一个用于Backbone的google组...有人可以指出这样做的一个例子吗?

3 个答案:

答案 0 :(得分:225)

看看这个带注释的源示例,他们用localstorage替换Backbone.sync覆盖

backbone-localStorage

基本上Backbone.sync应该是一个带有4个参数的函数:

Backbone.sync = function(method, model, options) { };

您需要触发options.successoptions.error,具体取决于method是否成功。方法的格式为:

  • "create":希望您在服务器上创建模型
  • "read":希望您从服务器读取此模型并将其返回
  • "update":希望您使用参数
  • 更新服务器上的模型
  • "delete":您希望从服务器中删除该模型。

您需要实施这4种方法,并为"server"

定义您想要的任何内容

当然,这些只是Backbone.sync 必须实施的内容。您可以实施更多methods,并且可以将更多参数传递回success,但最好不要这样做。

最好确保它与当前的Backbone.sync一样,以便您对接口进行编程而不是实现。如果您想要将已修改的Backbone.sync切换为localStorage,那么您不必自己扩展它以匹配扩展的Backbone.sync“

<强> [编辑]

另请注意,您可以使用sync的多个实现。对Backbone.sync的每次引用都是(this.sync || Backbone.sync),因此您只需执行以下操作:

var MyModel = Backbone.Model.extend({ 
    ...

    "sync": myOwnSpecificSync,

    ...
});

Backbone.sync只是所有模型使用的默认全局模型,除非模型具有专门设置的sync方法。

答案 1 :(得分:15)

我知道这个答案有点太晚了,来自@Raynos的答案很棒,但我做的有点不同,也许对你或任何其他试图使用Backbone API的人都有用

我没有覆盖Backbone.sync,而是覆盖Backbone.ajax,因为它是发出ajax请求的地方。

以下是一个例子:

// Set the default implementation of `Backbone.ajax` to proxy through to `$`.
Backbone.ajax = function() {
    var args = Array.prototype.slice.call(arguments, 0);

    // Here, I add the OAuth token (or any other token)
    // But before, I check that data exists, if not I add it
    if (args[0]['data'] === undefined) {
        args[0]['data'] = {};
    }
    args[0]['data']['token'] = 'any_api_token_here';

    return Backbone.$.ajax.apply(Backbone.$, args);
};

答案 2 :(得分:11)

当我只需要同步某些属性时,我通常需要覆盖主干的sync方法。典型的实现如下所示:

sync: function (method, model, options) {
  options.data = _.pick(this.attributes, 'foo', 'bar', 'baz');
  return Backbone.sync.call(this, method, model, options);
}