如何重写 Backbone.sync?

我正在尝试 Backbone.js,我尝试的事情之一是调用远程 API,所以我需要能够覆盖 Backbone.sync,正如我所理解的 文件

在文档本身中没有这样做的例子,而且似乎也没有一个用于 Backbone 的 google 组... ... 有人能为这样做指出一个例子吗?

60701 次浏览

看一下这个带注释的源代码示例,它们使用本地存储替代方案覆盖 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方法。

我知道这个答案有点太晚了,而@Raynos 的答案很棒,但是我做的有点不同,也许对你或者其他尝试使用 Backbone API 的人会有用。

我没有重写 Backbone.sync,而是重写了 挺胸抬头 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);
}