如何覆盖Backbone.sync?

pic*_*rdo 145 javascript backbone.js

我正在尝试Backbone.js,我正在尝试的其中一件事是调用远程API,所以我需要能够覆盖Backbone.sync,因为我理解文档.

在文档本身没有一个如何做到这一点的例子,并且似乎没有一个用于Backbone的谷歌组...有人可以指出这样做的一个例子吗?

Ray*_*nos 225

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

骨干,localStorage的

基本上Backbone.sync应该是一个带有4个参数的函数:

Backbone.sync = function(method, model, options) { };
Run Code Online (Sandbox Code Playgroud)

你需要解雇options.successoptions.error取决于是否method成功.方法的格式如下:

  • "create" :期望您在服务器上创建模型
  • "read" :期望您从服务器读取此模型并将其返回
  • "update" :期望您使用参数更新服务器上的模型
  • "delete" :期望您从服务器中删除模型.

您需要实现这4种方法并定义您想要的任何方法 "server"

当然,这些只是Backbone.sync 必须实施的事情.你可以实施更多methods,你可以将更多的参数传递回去,success但最好不要这样做.

最好确保它与Backbone.sync当前相同,以便您对接口进行编程,而不是实现.如果你想将你的修改版本改为Backbone.synclocalStorage,你不必自己扩展它以匹配扩展的Backbone.sync"

[编辑]

另请注意,您可以使用多个实现sync.每次引用Backbone.sync都是行动的,(this.sync || Backbone.sync)所以你只需要做一些事情:

var MyModel = Backbone.Model.extend({ 
    ...

    "sync": myOwnSpecificSync,

    ...
});
Run Code Online (Sandbox Code Playgroud)

Backbone.sync除非模型具有sync专门设置的方法,否则它只是所有模型使用的默认全局模型.

  • +1表示您可以覆盖特定模型的同步方法. (26认同)
  • `(this.sync || Backbone.sync)`参见编辑.进一步的提示是阅读注释的骨干来源.一切都在那里! (19认同)
  • 只需添加一个:如果你想从你的代码中的任何地方调用"默认"`sync`(通常是一个过度的`sync`),那就做一个`Backbone.sync.call(this,method,this,options)`. (12认同)
  • \ [编辑]关于每个模型有自己的同步后的细节是非常重要的!谢谢! (3认同)
  • 如果我想从localStorage获取模型,而另一个从服务器获取,该怎么办?这可能吗? (2认同)

Cyr*_* N. 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);
};
Run Code Online (Sandbox Code Playgroud)


Jes*_*son 11

sync当我只需要同步某些属性时,我通常需要覆盖骨干的方法.典型的实现如下所示:

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

  • 小建议:如何将最后一行更改为`Backbone.sync.apply(this,arguments);`?例如,如果您决定在重写版本的`sync`中省略"options"参数,则会稍微灵活一些. (3认同)