Backbone.js Modellüberprüfung nur beim Set-Save (nicht beim Fetch)

8

Vorbehalt: Ich arbeite mit einem Backend, über das ich nicht die volle Kontrolle habe, also wrestle ich mit ein paar Überlegungen in Backbone, die woanders besser behandelt werden könnten ... leider habe ich keine andere Wahl als Handle sie hier!

Mein Problem ist also, dass ich Benutzereingaben aus einem Formular wirklich validieren möchte (wenn ich Werte in Backbone-Modellen festlege), aber die Modelle, die ich von der API an neu erstellten Objekten erhalte (über NUR Einträge) einen Namen akzeptieren und NUR einen Namen und eine Objekt-ID zurückgeben) werden meine Validierungsüberprüfungen nicht bestehen.

Wenn beispielsweise ein neues Objekt in der Datenbank erstellt wird, werden zwei Schlüsselfelder als leere Zeichenfolgen aufgefüllt (und wenn Backbone die API aufruft und die Modelle auffüllt, werden diese Schlüssel mit leeren Zeichenfolgen gefüllt). Wenn der Benutzer diese Objekte zurückspeichert, post-edit, möchte ich sie zwingen, Werte für diese beiden Schlüssel einzugeben - was sehr einfach ist, wenn Backbones eingebaute Validierungsmethode verwendet wird.

Das Problem besteht natürlich darin, dass die Validierung sowohl auf das Abruf- & gt; -Set (unerwünschtes Verhalten) als auch auf das Set- & gt; -Speichern (gewünschtes Verhalten) feuert - und so neu erstellte Modelle überhaupt nicht geladen werden. ..Backbone sammelt sie, Validierung fehlschlägt und Fehler ausgelöst.

Meine Frage ist also: Gibt es einen "Backbone-y" Weg, nur die Modelle auf Set-& gt; Speichern, nicht auf Fetch- & gt; zu validieren? Könnte ich einen bestimmten Trigger verwenden, um dies zu umgehen?

Irgendwelche Ideen würden sehr geschätzt werden.

    
ltd 12.08.2011, 17:54
quelle

2 Antworten

7

Backbone.Model.set führt keine Validierung durch, wenn Sie { silent: true } übergeben, und fetch übergibt alle Optionen an set, so dass Sie entweder fetch überschreiben oder Ihre eigene fetchSilent -Methode schreiben können, die das übergibt in einem Optionsobjekt.

Sie könnten jedoch mit Backbone.Collection.fetch auf einen leichten Fehler stoßen, denn wenn er Attribute vom Server erhält, erstellt er nicht die neuen Modelle mit set . Stattdessen erstellt es ein neues Modell mit model = new this.model(attrs, {collection: this}); und führt dann eine Validierung durch, wenn für das Objekt eine validate -Methode vorhanden ist.

Das ist ein bisschen nervig. Sie können es umgehen, indem Sie eine parse -Methode für Ihre Sammlung definieren (falls Sie eine verwenden), die ein Modell automatisch erstellt (mit {silent: true} ), denn wenn Backbone.Collection.add ein voll ausgebildetes Backbone-Modell erhält, hat es t führen Sie die Validierung durch. (Siehe die Methoden _add und _prepareModel in der kommentierten Quelle ).

Es ist ein wenig nervig, dass die Sammlung so funktioniert, aber (zumindest jetzt) ​​ist es das, was es ist.

    
satchmorun 12.08.2011, 19:59
quelle
4

Anstatt den Abruf zu überschreiben, können Sie noch etwas anderes tun:

Wenn Sie Ihr Modell validieren, prüfen Sie auf model.silent und validieren Sie nur, wenn das nicht existiert.

So machen Sie Folgendes, wenn Sie ein Modell abholen wollen:

%Vor%

Dann können Sie das Modell holen. Nachdem Sie Ihr Modell erhalten haben, können Sie es für die zukünftige Validierung deaktivieren.

    
alessioalex 13.06.2012 10:27
quelle

Tags und Links