如何覆盖Backbone.sync?
我尝试了Backbone.js,我试图调用一个远程API,所以我需要能够覆盖Backbone.sync,因为我理解的文档 。
在文档本身中没有如何做到这一点的例子,似乎没有一个谷歌的骨干群…有人可以指出一个例子这样做吗?
看看这个带注释的源代码示例,它们用localstorage替代方法覆盖Backbone.sync
骨干,localStorage的
基本上Backbone.sync应该是一个函数,需要4个参数:
Backbone.sync = function(method, model, options) { };
您需要根据method
是否成功触发options.success
或options.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); }