我正在尝试Backbone.js,而我正在尝试的事情之一就是调用远程API,因此,据我了解的文档资料,我需要能够覆盖Backbone.sync 。
在文档本身中没有如何执行此操作的示例,并且似乎没有用于Backbone的google组...有人可以指出执行此操作的示例吗?
我正在尝试Backbone.js,而我正在尝试的事情之一就是调用远程API,因此,据我了解的文档资料,我需要能够覆盖Backbone.sync 。
在文档本身中没有如何执行此操作的示例,并且似乎没有用于Backbone的google组...有人可以指出执行此操作的示例吗?
Answers:
看一下这个带注释的源示例,在该示例中,它们被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
专门设置的方法。
(this.sync || Backbone.sync)
参见编辑。另一个技巧是阅读带注释的主干源。都在那里!
sync
在代码中的任何地方调用“默认” (通常是overrydden sync
),只需执行即可Backbone.sync.call(this, method, this, options)
。
我知道这个答案为时已晚,@ 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);
};
sync
当我只需要同步某些属性时,通常需要覆盖主干的方法。一个典型的实现如下所示:
sync: function (method, model, options) {
options.data = _.pick(this.attributes, 'foo', 'bar', 'baz');
return Backbone.sync.call(this, method, model, options);
}
Backbone.sync.apply(this, arguments);
?例如,如果您决定在的重写版本中忽略“ options”参数,则会稍微灵活一些sync
。
Backbone.model.save(attributes, {patch: true})
现在可以用来进行部分更新