Come sovrascrivere Backbone.sync?


145

Sto provando Backbone.js e una delle cose che sto provando è di effettuare una chiamata a un'API remota, quindi devo essere in grado di sovrascrivere Backbone.sync, come ho capito la documentazione .

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


4
In assenza di un gruppo Google, prova a controllare la stanza #documentcloud su freenode e a porre la tua domanda lì. Assicurati di tornare qui e rispondere alla tua domanda se ricevi una risposta. Ci sono molte discussioni interessanti lì ed è bello codificarlo e renderlo ricercabile per coloro che ti seguono.
Andrew De Andrade,

Risposte:


225

Dai un'occhiata a questo esempio di sorgente con annotazioni in cui sovrascrivono Backbone.synccon un'alternativa di archivio locale

backbone-localStorage

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

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

Devi sparare options.successo a options.errorseconda che ci sia methodriuscito. I metodi sono nel formato:

  • "create" : previsto che si crei il modello sul server
  • "read" : previsto di leggere questo modello dal server e restituirlo
  • "update" : previsto che si aggiorni il modello sul server con l'argomento
  • "delete" : previsto che si elimina il modello dal server.

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

Naturalmente queste sono solo le cose che Backbone.sync devono essere implementate. Puoi implementare di più methodse puoi restituire più parametri, successma è meglio non farlo.

È meglio assicurarsi che faccia lo stesso come Backbone.syncattualmente in modo che la programmazione su un'interfaccia piuttosto che un'implementazione. Se vuoi cambiare il tuo modificato Backbone.syncper dire quello localStorage non dovrai estenderlo tu stesso per abbinare il tuo Backbone.sync esteso "

[Modificare]

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

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

    "sync": myOwnSpecificSync,

    ...
});

Backbone.syncè solo quello globale predefinito che tutti i modelli usano a meno che i modelli non abbiano un syncmetodo specificamente impostato.


2
Cosa succede se desidero recuperare un modello da localStorage, mentre un altro recupera dal server? È ancora possibile?
picardo,

19
(this.sync || Backbone.sync)Vedi modifica. Un ulteriore suggerimento è leggere la fonte annotata di backbone. È tutto lì!
Raynos,

3
Il dettaglio dopo [Modifica] su ogni modello con la propria sincronizzazione è molto importante! Grazie!
Abel,

26
+1 per menzionare il fatto che è possibile ignorare il metodo di sincronizzazione di un modello specifico.
Chetan,

12
Solo un'aggiunta: se vuoi chiamare il "default" syncda qualsiasi parte del tuo codice (in genere un overrydden sync), basta fare un Backbone.sync.call(this, method, this, options).
asimmetrico,

15

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

Invece di sovrascrivere Backbone.sync, ho ignorato Backbone.ajax , perché è dove viene fatta 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);
};

11

In genere ho bisogno di sostituire il syncmetodo backbone quando devo solo sincronizzare determinati attributi. Un'implementazione tipica è simile alla seguente:

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

e questo va nel Modello o nella Collezione.
Gabe Rainbow,

3
Suggerimento minore: che ne dici di cambiare l'ultima riga in Backbone.sync.apply(this, arguments);? È leggermente più flessibile se, ad esempio, decidi di escludere l'argomento "opzioni" nella versione sostituita di sync.
Lochlan,

Qualcos'altro per i futuri cercatori di questa domanda: assicurati di restituire Backbone.sync a la backbonejs.org/docs/backbone.html#section-62
Lochlan

1
Backbone.model.save(attributes, {patch: true})Ora puoi usare gli aggiornamenti parziali
roborourke,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.