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.