如何覆盖Backbone.sync?

我尝试了Backbone.js,我试图调用一个远程API,所以我需要能够覆盖Backbone.sync,因为我理解的文档 。

在文档本身中没有如何做到这一点的例子,似乎没有一个谷歌的骨干群…有人可以指出一个例子这样做吗?

看看这个带注释的源代码示例,它们用localstorage替代方法覆盖Backbone.sync

骨干,localStorage的

基本上Backbone.sync应该是一个函数,需要4个参数:

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

您需要根据method是否成功触发options.successoptions.error 。 这些方法的格式如下:

  • "create" :期望您在服务器上创build模型
  • "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方法。

我知道这个答案有点太晚了,来自@Raynos的答案很好,但是我做了一些改变,也许对于你或者其他任何试图使用骨干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); }; 

当我只需要同步某些属性时,我通常需要覆盖主干的sync方法。 一个典型的实现看起来像这样:

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