Wie überschreibe ich Backbone.sync?

145

Ich probiere Backbone.js aus und versuche unter anderem, eine Remote-API aufzurufen. Daher muss ich Backbone.sync überschreiben können, da ich die Dokumentation verstehe .

In der Dokumentation selbst gibt es kein Beispiel dafür, und es scheint keine Google-Gruppe für Backbone zu geben. Kann jemand ein Beispiel dafür nennen?

Picardo
quelle
4
Wenn keine Google-Gruppe vorhanden ist, überprüfen Sie den Raum #documentcloud auf freenode und stellen Sie dort Ihre Frage. Kommen Sie einfach hierher zurück und beantworten Sie Ihre eigene Frage, wenn Sie eine Antwort erhalten. Es gibt dort viele großartige Diskussionen und es ist schön, sie zu kodifizieren und für diejenigen durchsuchbar zu machen, die nach Ihnen kommen.
Andrew De Andrade
3
Zu Ihrer Information
Drew Dara-Abrams

Antworten:

225

Schauen Sie sich dieses mit Anmerkungen versehene Quellbeispiel an, in dem sie Backbone.syncmit einer lokalen Speicheralternative überschrieben werden

backbone-localStorage

Grundsätzlich sollte Backbone.sync eine Funktion sein, die 4 Argumente akzeptiert:

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

Sie müssen entweder options.successoder options.errorje nachdem, ob der methoderfolgreich war , feuern . Die Methoden haben das folgende Format:

  • "create" : erwartet, dass Sie das Modell auf dem Server erstellen
  • "read" : erwartet, dass Sie dieses Modell vom Server lesen und zurückgeben
  • "update" : erwartet, dass Sie das Modell auf dem Server mit dem Argument aktualisieren
  • "delete" : erwartet, dass Sie das Modell vom Server löschen.

Sie müssen diese 4 Methoden implementieren und definieren, was Sie für Ihre wollen "server"

Natürlich sind dies nur die Dinge, Backbone.sync die implementiert werden müssen . Sie können mehr implementieren methodsund mehr Parameter zurückgeben, successaber es ist am besten, dies nicht zu tun.

Stellen Sie am besten sicher, dass es dasselbe Backbone.synctut wie derzeit, damit Sie auf eine Schnittstelle programmieren und nicht auf eine Implementierung. Wenn Sie Ihre Modifikation beispielsweise Backbone.syncfür die localStorage-Version austauschen möchten, müssen Sie sie nicht selbst erweitern, um sie an Ihre erweiterte Backbone.sync anzupassen. "

[Bearbeiten]

Beachten Sie auch, dass Sie mehrere Implementierungen von verwenden können sync. Jeder Verweis auf Backbone.syncist wirklich, (this.sync || Backbone.sync)also müssen Sie nur etwas tun wie:

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

    "sync": myOwnSpecificSync,

    ...
});

Backbone.syncist nur die globale Standardeinstellung, die von allen Modellen verwendet wird, es sei denn, für die Modelle ist eine syncbestimmte Methode festgelegt.

Raynos
quelle
2
Was ist, wenn ein Modell von localStorage abgerufen werden soll, während ein anderes vom Server abgerufen wird? Ist das schon möglich?
Picardo
19
(this.sync || Backbone.sync)Siehe Bearbeiten. Ein weiterer Tipp ist das Lesen der mit Anmerkungen versehenen Quelle des Backbones. Es ist alles da!
Raynos
3
Das Detail nach [Bearbeiten] über jedes Modell mit eigener Synchronisierung ist sehr wichtig! Vielen Dank!
Abel
26
+1 für die Erwähnung der Tatsache, dass Sie die Synchronisierungsmethode eines bestimmten Modells überschreiben können.
Chetan
12
Nur eine Ergänzung: Wenn Sie die "Standardeinstellung" syncvon einer beliebigen Stelle in Ihrem Code aus aufrufen möchten (normalerweise eine Überlastung sync), führen Sie einfach eine aus Backbone.sync.call(this, method, this, options).
asymmetrisch
15

Ich weiß, dass diese Antwort etwas zu spät ist und die Antwort von @Raynos großartig ist, aber ich habe es ein bisschen anders gemacht, und vielleicht wäre es nützlich für Sie oder für jede andere Person, die versucht, eine API mit Backbone zu verwenden.

Anstatt Backbone.sync zu überschreiben, habe ich Backbone.ajax überschrieben , da hier die Ajax-Anfrage gestellt wird.

Hier ist ein Beispiel:

// 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.
quelle
11

Normalerweise muss ich die Backbone- syncMethode überschreiben , wenn ich nur bestimmte Attribute synchronisieren muss. Eine typische Implementierung sieht folgendermaßen aus:

sync: function (method, model, options) {
  options.data = _.pick(this.attributes, 'foo', 'bar', 'baz');
  return Backbone.sync.call(this, method, model, options);
}
Jesse Atkinson
quelle
und das geht in Modell oder Sammlung.
Gabe Rainbow
3
Kleiner Vorschlag: Wie wäre es, die letzte Zeile in zu ändern Backbone.sync.apply(this, arguments);? Es ist etwas flexibler, wenn Sie beispielsweise das Argument "options" in der überschriebenen Version von weglassen sync.
Lochlan
Noch etwas für zukünftige Finder dieser Frage: Stellen Sie sicher, dass Sie Backbone.sync a la backbonejs.org/docs/backbone.html#section-62
Lochlan
1
Sie können Backbone.model.save(attributes, {patch: true})jetzt
Teilaktualisierungen durchführen