2012-06-15 2 views
15

Ich habe schon seit einiger Zeit damit zu kämpfen; Mal sehen, ob mir jemand helfen kann.Was ist das Standardmuster für die Validierung von Glutendaten? (ungültiger Zustand, wurde zu Invalid ...)

Obwohl es nicht explizit in der Readme gesagt wird, bietet ember-data einige Validierungen Unterstützung. Sie können auf einige Teile des Codes und der Dokumentation sehen, dass:

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/states.js#L411

https://github.com/emberjs/data/blob/master/packages/ember-data/lib/system/model/states.js#L529

Der REST-Adapter hinzufügen nicht Validierungen auf sich selbst zu unterstützen, aber ich fand heraus, dass, wenn ich hinzufügen, so etwas wie dieses in den ajax-Aufrufe, kann ich das Modell auf einem „ungültigen“ Zustand mit dem Fehler Objekt setzen, die von der Server-Seite kam:

error: function(xhr){ 
    var data = Ember.$.parseJSON(xhr.responseText); 
    store.recordWasInvalid(record, data.errors); 
} 

So kann ich einfach auf die folgenden:

var transaction = App.store.transaction(); 
var record = transaction.createRecord(App.Post); 
record.set('someProperty', 'invalid value'); 
transaction.commit() 
// This makes the validation fail 

record.set('someProperty', 'a valid value'); 
transaction.commit(); 
// This doesn't trigger the commit again. 

Die Sache ist die: Wie Sie sehen, Transaktionen nicht versuchen, zu verpflichten. Dies wird erklärt here und here.

Die Sache ist also: Wenn ich ein Commit nicht wiederverwenden kann, wie soll ich damit umgehen? Ich vermute, dass etwas mit der Tatsache zu tun hat, dass ich asynchron das Modell auf den invalid -Status setze - durch reading the documentation scheint es, als ob etwas für clientseitige Validierungen gemeint ist. In diesem Fall, wie soll ich sie benutzen?

Antwort

1

dies mag eine zu einfache Antwort sein, aber warum nicht eine neue Transaktion erstellen und den bereits vorhandenen Datensatz hinzufügen? Ich versuche auch, einen Fehlerbehandlungsansatz herauszufinden.

sollten Sie wahrscheinlich darüber nachdenken, dies auf der Ebene des Geschäfts statt auf der Ebene des Adapters zu schreiben, um sie wiederverwenden zu können.

+1

wäre dies nicht problematisch sein, da Sie nicht schmutzig Objekte zu Transaktionen hinzufügen können? –

1

Aus unbekannten Gründen wird der Datensatz Teil der Standardtransaktion des Geschäfts. Dieser Code funktioniert für mich:

var transaction = App.store.transaction(); 
var record = transaction.createRecord(App.Post); 
record.set('someProperty', 'invalid value'); 
transaction.commit() 

record.set('someProperty', 'a valid value'); 
App.store.commit(); // The record is created in backend 

Das Problem ist, dass nach dem ersten Ausfall, immer die App.store.commit() mit den Problemen verwenden müssen, es hat.

+0

Ich könnte falsch liegen, aber ich denke, es wird als Standard-Transaktion zugeordnet, es sei denn, Sie definieren einen Kontext speziell. – Marco

+0

Haben Sie Beispiele dafür? –

2

Ich versuchte Javier Antwort, aber ich bekomme "Ungültiger Pfad", wenn Sie eine record.set(...) mit dem Datensatz im ungültigen Zustand. Was ich fand, arbeitete war:

// with the record in invalid state 
record.send('becameValid'); 
record.set('someProperty', 'a valid value'); 
App.store.commit(); 

Alternativ, so scheint es, dass, wenn ich record.get(...)record.set(...) Anrufe dann anschließenden ersten Anruf zu arbeiten. Dies ist wahrscheinlich ein Fehler. Die oben beschriebene Problemumgehung wird jedoch im Allgemeinen funktionieren, um denselben Datensatz erneut zu binden, ohne dass Eigenschaften geändert werden müssen. (Natürlich, wenn die Eigenschaften noch ungültig sind, wird es nicht nur wieder.)

+0

Ich habe 'record.send (' wurdeValid '); 'in meinem Modell' anInvalid'-Funktion hinzugefügt. Das hat mein Problem gelöst. Dies wird durch einen Kommentar zu GitHub Pull Request von Cyril inspiriert. – ybart

Verwandte Themen