Como substituir o Backbone.sync?

145

Estou testando o Backbone.js, e uma das coisas que estou tentando é fazer uma chamada para uma API remota; portanto, preciso substituir o Backbone.sync, pois entendo a documentação .

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

picardo
fonte
4
Na ausência de um grupo do Google, tente acessar a #documentcloud room no freenode e fazer sua pergunta lá. Apenas volte aqui e responda sua própria pergunta, se você receber uma resposta. Há muitas discussões excelentes por lá e é bom codificá-lo e torná-lo pesquisável para aqueles que vêm depois de você.
Andrew De Andrade
3
FYI: groups.google.com/group/backbonejs
Drew Dara-Abrams,

Respostas:

225

Dê uma olhada neste exemplo de fonte anotado em que eles substituem Backbone.syncpor uma alternativa de armazenamento local

backbone-localStorage

Basicamente, o Backbone.sync deve ser uma função que recebe 4 argumentos:

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

Você precisa disparar um options.successou options.errordependendo do methodêxito. Os métodos estão no formato:

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

Você precisa implementar esses 4 métodos e definir o que quiser para o seu "server"

Claro que estas são apenas as coisas que Backbone.sync devem ser implementadas. Você pode implementar mais methodse transmitir mais paramaters, successmas é melhor não fazer isso.

É melhor garantir que ele faça o mesmo Backbone.syncque atualmente, para que sua programação para uma interface e não para uma implementação. Se você quiser mudar o seu modificado Backbone.syncpara, por exemplo, o localStorage, você não precisará estendê-lo por conta própria para corresponder ao seu Backbone.sync estendido "

[Editar]

Observe também que você pode usar várias implementações de sync. Todas as referências a Backbone.syncsão verdadeiras, (this.sync || Backbone.sync)então você só precisa fazer algo como:

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

    "sync": myOwnSpecificSync,

    ...
});

Backbone.syncé apenas o padrão global usado por todos os modelos, a menos que os modelos tenham um syncmétodo definido especificamente.

Raynos
fonte
2
E se eu quiser que um modelo seja buscado no localStorage, enquanto outro buscar no servidor? Isso ainda é possível?
picardo
19
(this.sync || Backbone.sync)Veja editar. Uma dica adicional é ler a fonte anotada do backbone. Está tudo lá!
Raynos
3
Os detalhes após [Editar] sobre cada modelo tendo sua própria sincronização são super importantes! Obrigado!
Abel
26
+1 por mencionar o fato de que você pode substituir o método de sincronização de um modelo específico.
Chetan
12
Apenas uma adição: se você quiser chamar o "padrão" syncde qualquer lugar do seu código (normalmente um overrydden sync), basta fazer a Backbone.sync.call(this, method, this, options).
assimétrica
15

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

Em vez de substituir o Backbone.sync, substitui 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);
};
Cyril N.
fonte
11

Normalmente, preciso substituir o syncmétodo do backbone quando preciso sincronizar apenas determinados atributos. Uma implementação típica é assim:

sync: function (method, model, options) {
  options.data = _.pick(this.attributes, 'foo', 'bar', 'baz');
  return Backbone.sync.call(this, method, model, options);
}
Jesse Atkinson
fonte
e isso entra em modelo ou coleção.
Gabe arco-íris
3
Sugestão secundária: que tal mudar essa última linha para Backbone.sync.apply(this, arguments);? É um pouco mais flexível se você, por exemplo, decidir deixar de fora o argumento "opções" na versão substituída do sync.
21815 Lochlan
Outra coisa para os futuros pesquisadores desta pergunta: certifique-se de retornar o Backbone.sync para la backbonejs.org/docs/backbone.html#section-62
Lochlan
1
Você pode usar Backbone.model.save(attributes, {patch: true})para fazer atualizações parciais agora
roborourke