backbone.js: gibt es eine Veränderung seit dem letzten server-speichern?
Ich habe ein Rückgrat-Modell.
Mit Modell.set() ich kann ein lokaler Wert, mit dem Modell.save() kann ich speichern das ganze Modell an den server.
Woher weiß ich, ob es eine änderung seit dem letzten server-speichern die Bedeutung der lokalen version ist schmutzig.
Modell.isNew(); funktioniert nur, wenn das Modell noch nie auf dem server gespeichert.
- Das dirty bit ist nicht dasselbe wie die überprüfung, ob es sich verändert hat (je nach definition). Ex: das Modell konnte zunächst isGood: true, änderungen isGood: false, dann zurück zu isGood: true. Das dirty-bit wäre in diesem Fall, aber das Modell nicht wirklich geändert. Ist das in Ordnung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: Dieser Antwort wurde geschrieben, bevor die version 1.0 von Rückgrat. Wie der aktuelle Backbone-version (1.2.2)
hasChanged
spiegelt nicht mehr "seit dem letzten "speichern" die änderungen. Stattdessen spiegelt die änderungen wieder, "seit dem letzten set".Hören für change-events oder schauen Sie
hasChanged
.Wenn das Modell sich geändert hat, können Sie auf "ändern". Sie können auch Draht Ihre save-Methode ausgelöst, wenn das change-Ereignis passiert.
Wenn Sie nicht speichern möchten, auf ändern, dann legen Sie eine Eigenschaft für das Modell fehlerhaft und löschen Sie es, wenn Sie explizit speichern.
Etwas wie:
change
Ereignis und diehasChanged
Methode. Dies ist eine Möglichkeit zur Implementierung einer lazy-speichern-nur-wenn-dirty-data-system. Im Idealfall würden Sie rufenmodel.save()
wenn Sie erhalten diechange
Veranstaltung. So, wenn Sie verlieren der Kunde verlieren Sie nicht Ihre änderungen.hasChanged
ich weiß nicht, der Weg zu sagen, hasChanged UND hasNotSaved oder etwas ähnliches. Obwohl die Erweiterung Backbone core ist ziemlich einfach, so dass es Hinzugefügt werden könntenchanged
bekommen, gelöscht, auf jedenset
? Von Backbone-docs "Die veränderte Eigenschaft ist die interne hash mit allen Parametern, die geändert wurden seit Ihrem letzten Satz. "Also, wenn Sie nichtfoo.set('a', 1); foo.set('b', 2)
,changed
umfassen würdeb
aber nichta
, richtig? Das ist nicht sehr nützlich für die Bestimmung "hat ___ geändert seit dem letzten speichern".Ich bin das arbeiten mit CouchDB und Couch hat eine _rev-Attribut, das ändert sich nach jedem speichern Erfolg. Ich löste das problem der "seit-letzten-server-speichern", indem Sie den folgenden code in die Modelle initialize-Funktion:
Alternative option ist zu setzen, alle Ihre Aktualisierungen zu "Stille" updates, und sammeln Sie dann die änderungen, wenn Sie synchronisieren möchten:
Alle Antworten, die darauf hindeutet, hören für änderungen (mit Veranstaltungen) korrekt sind, es sei denn, Sie gehen { silent: true } option. In diesem Fall müssen Sie überschreiben default-Satz-Methode zum speichern von Parametern, die geändert wurde, und reset, die Liste nach dem Aufruf der save-Methode.
MidnightLightning s Antwort ist nicht korrekt. Wenn Sie anrufen, stellen Sie "Methode" zweimal, dann changedAttributes wird wieder nur die Attribute ändern da die letzten call - in Backbone-Dokumentation:
changedAttributesmodel.changedAttributes([attributes])
In meinem Fall habe ich das problem gelöst mit diesem code:
Wenn ich will, um alle geänderten Attribute ich verwenden silentChages Eigenschaft in das Modell.
Wenn ich will, um trigger-Ereignis für alle set/unset Attribute, wenn ich sparen, ich Stell 'triggerSilents: true" option. Ich kann auch manuell auslösen, alle änderungen-Ereignis durch den Aufruf triggerSilentChanges Methode.
Nur für reference, habe ich ein kleines Code-Snippet, das ersetzt die Standard-Backbone.sync-Methode.
Das Rückgrat ersetzt.sync-zahlen, welche Attribute sich geändert hat seit dem letzten speichern() und es funktioniert mit beiden Modellen und Sammlungen.
https://github.com/ChiefORZ/backbone.dirty-sync