Come sovrascrivere Backbone.sync?

Sto provando Backbone.js e una delle cose che sto cercando è di effettuare una chiamata a un’API remota, quindi devo essere in grado di eseguire l’override di Backbone.sync, poiché comprendo la documentazione .

Non c’è un esempio di come farlo nella documentazione stessa, e non sembra essere un gruppo google per Backbone … qualcuno può indicare un esempio per farlo?

Dai un’occhiata a questo esempio di fonte annotata dove sovrascrivono Backbone.sync con un’alternativa di memoria locale

backbone-localStorage

Fondamentalmente Backbone.sync dovrebbe essere una funzione che accetta 4 argomenti:

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

È necessario sparare a options.success o options.error seconda che il method avuto successo. I metodi sono nel formato:

  • "create" : si prevede che si crei il modello sul server
  • "read" : si aspetta che tu legga questo modello dal server e lo restituisca
  • "update" : si prevede che si aggiorni il modello sul server con l’argomento
  • "delete" : si prevede che si cancelli il modello dal server.

Devi implementare questi 4 metodi e definire quello che vuoi per il tuo "server"

Ovviamente queste sono solo le cose che Backbone.sync deve implementare. Potresti implementare più methods e potresti passare più parametri al success ma è meglio non farlo.

È meglio assicurarsi che funzioni come Backbone.sync momento, in modo che la programmazione su un’interfaccia piuttosto che un’implementazione. Se vuoi cambiare il tuo Backbone.sync modificato per dire quello localStorage non dovrai estenderlo da solo per abbinare il tuo Backbone.sync esteso ”

[Modificare]

Si noti inoltre che è ansible utilizzare più implementazioni di sync . Ogni riferimento a Backbone.sync è actaully (this.sync || Backbone.sync) quindi devi solo fare qualcosa del tipo:

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

Backbone.sync è solo il globale di default che tutti i modelli usano a meno che i modelli abbiano un metodo di sync appositamente impostato.

So che questa risposta è un po ‘troppo tardi e la risposta di @Raynos è ottima, ma l’ho fatto in modo un po’ diverso e forse sarebbe stato utile per te o per qualsiasi altra persona che cercava di utilizzare un’API con Backbone.

Invece di eseguire l’override di Backbone.sync, ho eseguito l’ override di Backbone.ajax , perché è dove viene effettuata la richiesta Ajax.

Ecco un esempio:

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

In genere, ho bisogno di sovrascrivere il metodo di sync di backbone quando devo sincronizzare solo determinati attributi. Una tipica implementazione è la seguente:

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