Como sobrescrever o Backbone.sync?

Eu estou experimentando o Backbone.js, e uma das coisas que estou tentando é fazer uma chamada para uma API remota, então eu preciso ser capaz de replace o Backbone.sync, como eu entendo a documentação .

Não há um exemplo de como fazer isso na própria documentação, e parece não haver um grupo do Google para o Backbone … alguém pode apontar um exemplo para fazer isso?

Dê uma olhada neste exemplo de fonte anotada onde eles sobrescrevem o Backbone.sync com uma alternativa de armazenamento local

backbone-localStorage

Basicamente Backbone.sync deve ser uma function que leva 4 argumentos:

 Backbone.sync = function(method, model, options) { }; 

Você precisa triggersr o options.success ou o options.error dependendo se o method bem-sucedido. Os methods estão no formato:

  • "create" : esperado que você crie o modelo no servidor
  • "read" : espera-se que você leia este modelo do servidor e devolva-o
  • "update" : espera-se que você atualize o modelo no servidor com o argumento
  • "delete" : espera-se que você exclua o modelo do servidor.

Você precisa implementar esses 4 methods e definir o que quiser para o seu "server"

Claro que estas são apenas as coisas que o Backbone.sync deve implementar. Você pode implementar mais methods e pode passar mais parâmetros para o success mas é melhor não fazer isso.

É melhor certificar-se de que ele faz o mesmo que o Backbone.sync faz atualmente para que você programe para uma interface, em vez de uma implementação. Se você quiser mudar o seu Backbone.sync modificado para dizer o localStorage você não terá que estendê-lo sozinho para corresponder ao seu estendido Backbone.sync ”

[Editar]

Além disso, observe que você pode usar várias implementações de sync . Toda referência ao Backbone.sync é actaully (this.sync || Backbone.sync) então você só tem que fazer algo como:

 var MyModel = Backbone.Model.extend({ ... "sync": myOwnSpecificSync, ... }); 

Backbone.sync é apenas o padrão global que todos os modelos usam, a menos que os modelos tenham um método de sync especificamente definido.

Eu sei que esta resposta é um pouco tarde demais, e a resposta do @Raynos é ótima, mas eu fiz de forma um pouco diferente, e talvez seja útil para você ou para qualquer outra pessoa que esteja tentando usar uma API com o Backbone.

Em vez de sobrescrever o Backbone.sync, eu substituí o Backbone.ajax , porque é onde a solicitação do ajax é feita.

Aqui está um exemplo:

 // 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); }; 

Eu normalmente preciso replace o método de sync do backbone quando preciso apenas sincronizar certos atributos. Uma implementação típica se parece com isso:

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