我正在尝试Backbone.js,我正在尝试的其中一件事就是调用远程API,所以我需要能够覆盖Backbone.sync,因为我理解{{3} }。
在文档本身没有一个如何做到这一点的例子,并且似乎没有一个用于Backbone的google组...有人可以指出这样做的一个例子吗?
答案 0 :(得分:225)
看看这个带注释的源示例,他们用localstorage替换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
方法。
答案 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);
}