Gewusst wie: Rollback-Beziehungsänderungen in EmberData

8

Ich habe zwei Modelle mit Eltern-Kind-Beziehung: Training und Bewegung:

%Vor%

Ich möchte eine Seite haben, auf der ein Training mit allen zugehörigen Übungen angezeigt wird. Wenn der Benutzer die Taste Edit drückt, wird die Seite mit der Möglichkeit bearbeitet, neue Übungen hinzuzufügen. Ich möchte auch eine Cancel -Schaltfläche haben, die alle vorgenommenen Änderungen verwirft.

Hier ist mein Controller:

%Vor%

Es gibt vier Event-Handler im Controller:

  1. edit : Der Benutzer hat die Taste Edit gedrückt: Eine Transaktion wird erstellt, die Seite wird in den Modus "Bearbeiten" versetzt.
  2. cancel : Der Benutzer hat die Schaltfläche Cancel gedrückt: Die Transaktion wird zurückgesetzt und zurück in den "normalen" Modus versetzt.
  3. save : Der Benutzer hat die Taste Save gedrückt: Die Transaktion wird ausgeführt und zurück in den "normalen" Modus.
  4. addExercise : Der Benutzer hat die Taste Add exercise gedrückt: eine neue Übung wird erstellt (in derselben Transaktion) und den Trainings hinzugefügt.

Die Rollback-Funktion funktioniert einwandfrei, außer bei neu erstellten Datensätzen: Wenn ich die Edit -Taste drücke, eine neue Übung hinzufüge und die Cancel -Taste drücke, bleibt die neu erstellte Übung auf der Seite.

Was ist der beste Weg, um den verworfenen Kind-Datensatz loszuwerden?

UPDATE:

Ich habe ein jsFiddle erstellt, um das Problem zu reproduzieren, aber es hat funktioniert. Im Gegensatz zu meiner Bewerbung habe ich DS.FixtureAdapter : Ссылка

verwendet

Dann habe ich einen anderen mit DS.RESTAdapter erstellt und das Problem tauchte auf: Ссылка

In der Geige versuchen: Bearbeiten, neue hinzufügen und dann Rollback.

Ich habe herausgefunden, dass im Falle des RESTAdapters, wenn ich einen neuen Kinddatensatz zu einer hasMany Beziehung hinzufüge, der Elterndatensatz nicht schmutzig wird. Das scheint in Ordnung, aber wenn ich die Transaktion zurücksetze, bleibt der neu erstellte Kind-Datensatz im ManyArray des Elternteils.

Ich weiß immer noch nicht, wie ich am besten mit der Situation umgehen kann.

    
tothda 04.02.2013, 10:45
quelle

4 Antworten

11

Ein richtiger Dirty-Check und Rollback für hasMany und anglesesTo-Beziehungen fehlen in Ember Data sehr. Die Art und Weise, wie es sich derzeit verhält, wird oft als Fehler gemeldet. Dies ist ein großer Schwachpunkt für viele Entwickler und es gibt eine laufende Diskussion darüber, wie das hier gelöst werden kann:

Ссылка

Bis es eine richtige Lösung gibt, können Sie dieses Problem umgehen, indem Sie den folgenden Ansatz verwenden.

Zunächst sollten Sie DS.Model erneut öffnen und erweitern. Wenn Sie globale Variablen verwenden, können Sie dies einfach (z. B. DS.Model.reopen ({})) an eine beliebige Stelle setzen. Wenn Sie jedoch Ember CLI verwenden, erstellen Sie am besten einen Initialisierer (z. B. ember g initialiser model):

%Vor%

Der obige Code speichert im Wesentlichen die ursprünglichen Beziehungen beim Laden oder Aktualisieren, so dass sie später für Rollback und Dirty Checking verwendet werden können.

model.rollback () sollte jetzt alles zurückrollen, einschließlich hasMany und anglesoTo-Beziehungen. Wir haben die Überprüfung von "isDirty" jedoch noch nicht vollständig durchgeführt. Um dies zu erreichen, müssen wir isDirty in der konkreten Implementierung eines Modells überschreiben. Der Grund, warum wir dies hier tun müssen und wir es nicht generisch in DS.Model tun können, liegt daran, dass DS.Model nicht weiß, auf welche Eigenschaftenänderungen geachtet werden soll. Hier ist ein Beispiel mit Ember CLI. Derselbe Ansatz wird mit globals verwendet, außer dass Sie diese Klasse einem App.Book-Element zuweisen:

%Vor%

Stellen Sie für die abhängigen Argumente von isDirty sicher, dass Sie alle anglesTo-Beziehungen einschließen und auch 'array. []' und 'array. @ each.isDirty' für jede hasMany-Beziehung einschließen. Jetzt sollte isDirty wie erwartet funktionieren.

    
Johnny Oshika 28.11.2014 07:54
quelle
1

Das ist nicht schön, aber Sie können es zum Rollback zwingen, indem Sie den übergeordneten Datensatz manuell beschmutzen:

%Vor%     
Nick Ragaz 11.04.2013 03:44
quelle
0

@tothda und andere Leser zu folgen. Ab Ember Data : 1.0.0-beta.10+canary.7db210f29a ist das übergeordnete Element immer noch nicht dafür ausgelegt, parentTraining.isDirty() zu einem Wert von true zu machen, wenn ein Kind zurückgesetzt wird. Ember Data tut einen übergeordneten Datensatz als dreckig , wenn Ein Attribut wird geändert, aber nicht , wenn ein DS.hasMany -Array Änderungen aufweist ( dies erlaubt save () zu arbeiten, damit Sie alle Änderungen an den Attributen des Elternteils auf dem Server aktualisieren können.

Dies wird in dem Fall, in dem Sie rollback() für ein neu erstelltes untergeordnetes Element ausführen möchten, durch Ersetzen von .rollback() durch .deleteRecord() für den untergeordneten Datensatz, den Sie verwerfen möchten, ersetzt. Ember Data erkennt dann automatisch, dass es aus dem DS.hasMany -Array entfernt wird, und Sie können sich auf die Rückseite klopfen, um einen Rollback durchzuführen!

    
Eric D. Johnson 28.08.2014 13:58
quelle
0

Ich habe ein Addon erstellt, das dieses Problem behebt. Rufen Sie einfach rollbackAttributes() auf und es wird auch Ihre Beziehungen zurückgesetzt:

Ссылка

    
dylanmensaert 15.12.2016 16:16
quelle