Rollback von Beziehungsänderungen in EmberData

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

App.Training = DS.Model.extend({
  exercises: DS.hasMany('App.Exercise')
})

App.Exercise = DS.Model.extend({
  training: DS.belongsTo('App.Training')
})

Ich möchte eine Seite haben, auf der ein Training mit allen zugehörigen Übungen angezeigt wird. Wenn der Benutzer die Taste drücktEdit Mit der Schaltfläche kann die Seite bearbeitet werden, und es können neue Übungen hinzugefügt werden. Ich möchte auch eine habenCancel Schaltfläche, mit der alle vorgenommenen Änderungen verworfen werden.

Hier ist mein Controller:

App.TrainingsShowController = Em.ObjectController.extend({
  editing: false,

  edit: function() {
    this.set('editing', true);
    transaction = this.get('store').transaction();
    transaction.add(this.get('model'));
    this.get('model.exercises').forEach(function(x){
      transaction.add(x);
    });
  },

  cancel: function() {
    this.set('editing', false);
    this.get('model.transaction').rollback();
  },

  save: function() {
    this.set('editing', false);
    this.get('model.transaction').commit();
  },

  addExercise: function() {
    this.get('model.exercises').createRecord({});
  }
})

Es gibt vier Ereignishandler im Controller:

edit: Der Benutzer hat die Taste gedrücktEdit Schaltfläche: Es wird eine Transaktion erstellt, die Seite wird in den Bearbeitungsmodus versetzt.cancel: Der Benutzer hat die Taste gedrücktCancel Taste: Transaktion wird zurückgesetzt und zurück in den "Normal" -Modus.save: Der Benutzer hat die Taste gedrücktSave Taste: Die Transaktion wird festgeschrieben und kehrt in den "Normal" -Modus zurück.addExercise: Der Benutzer hat die Taste gedrücktAdd exercise Schaltfläche: Eine neue Übung wird erstellt (in derselben Transaktion) und zu den Schulungen hinzugefügt.

Die Rollback-Funktion funktioniert einwandfrei, außer für neu erstellte Datensätze: Wenn ich die Taste drückeEdit Knopf, füge eine neue Übung hinzu und drücke denCancel Wenn Sie auf die Schaltfläche klicken, bleibt die neu erstellte Übung auf der Seite.

Was ist der beste Weg, um den weggeworfenen Kinderdatensatz loszuwerden?

AKTUALISIEREN:

Ich habe eine jsFiddle erstellt, um das Problem zu reproduzieren, aber es hat funktioniert. Im Gegensatz zu meiner Bewerbung hier habe ich verwendetDS.FixtureAdapter: http://jsfiddle.net/tothda/LaXLG/13/

Dann habe ich eine andere mit erstelltDS.RESTAdapter und das Problem zeigte sich:http://jsfiddle.net/tothda/qwZc4/5/

Versuchen Sie im Geigenspiel: Bearbeiten, Neu hinzufügen und dann Rollback.

Ich habe es herausgefunden, dass im Falle des RESTAdapters, wenn ich einen neuen Childdatensatz zu einem hinzufügehasMany Beziehung wird der übergeordnete Datensatz nicht verschmutzt. Das scheint in Ordnung zu sein, aber wenn ich die Transaktion rückgängig mache, verbleibt der neu erstellte untergeordnete Datensatz im übergeordneten DatensatzManyArray.

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

Antworten auf die Frage(4)

Ihre Antwort auf die Frage