如何覆盖Backbone.sync?


145

我正在尝试Backbone.js,而我正在尝试的事情之一就是调用远程API,因此,据我了解的文档资料,我需要能够覆盖Backbone.sync 。

在文档本身中没有如何执行此操作的示例,并且似乎没有用于Backbone的google组...有人可以指出执行此操作的示例吗?


4
如果没有Google网上论坛,请尝试检出freenode上的#documentcloud会议室并在那里提问。只要确保得到答案,请务必回到这里并回答您自己的问题。那里有很多精彩的讨论,很高兴对其进行整理,并使它可被您之后的搜索到。
Andrew De Andrade

Answers:


225

看一下这个带注释的源示例,在该示例中,它们被Backbone.sync本地存储替代项覆盖

骨干本地存储

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

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

您需要解雇,options.success还是options.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专门设置的方法。


2
如果我想从localStorage中获取模型,而又从服务器中获取模型,该怎么办?那有可能吗?
picardo 2011年

19
(this.sync || Backbone.sync)参见编辑。另一个技巧是阅读带注释的主干源。都在那里!
雷诺斯

3
[Edit]之后有关每个模型都有自己同步的细节非常重要!谢谢!
亚伯

26
+1代表您可以覆盖特定模型的同步方法这一事实。
Chetan

12
只是一个补充:如果您想sync在代码中的任何地方调用“默认” (通常是overrydden sync),只需执行即可Backbone.sync.call(this, method, this, options)
不对称的

15

我知道这个答案为时已晚,@ Raynos的回答很棒,但是我做的却有些不同,也许对您或其他任何试图将API与Backbone一起使用的人都有用。

我没有覆盖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);
};

11

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

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

然后进入模型或集合。
Gabe Rainbow

3
次要建议:将最后一行更改为Backbone.sync.apply(this, arguments);?例如,如果您决定在的重写版本中忽略“ options”参数,则会稍微灵活一些sync
罗奇兰

这个问题的未来发现者还有其他事情:确保返回Backbone.sync la 骨架
js.org/docs/backbone.html#section-62

1
Backbone.model.save(attributes, {patch: true})现在可以用来进行部分更新
roborourke
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.