Ich habe zwei Modelle mit Eltern-Kind-Beziehung: Ausbildung und Übung:Wie Rollback Beziehung Änderungen in EmberData
App.Training = DS.Model.extend({
exercises: DS.hasMany('App.Exercise')
})
App.Exercise = DS.Model.extend({
training: DS.belongsTo('App.Training')
})
Ich mag eine Seite haben, wo ein Training mit all ihren verwandten Übungen angezeigt. 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:
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 in der Steuerung vier Event-Handler sind:
edit
: Der Benutzer kann dieEdit
Taste gedrückt: eine Transaktion erstellt wird, wird die Seite setzen in "Bearbeiten" -Modus.cancel
: Der Benutzer drückte dieCancel
Schaltfläche: Die Transaktion wird zurückgesetzt und zurück in den "normalen" Modus.save
: Der Benutzer drückte dieSave
Schaltfläche: Transaktion wird festgeschrieben und zurück in den "normalen" Modus.addExercise
: Der Benutzer drückte dieAdd exercise
Schaltfläche: eine neue Übung wird erstellt (in derselben Transaktion) und zu den Schulungen hinzugefügt.
Die Rollback-Funktionalität funktioniert gut für neu erstellte Datensätze mit Ausnahme: wenn ich die Edit
Taste drücken, eine neue Übung hinzufügen, und drücken Sie die Taste Cancel
, die neu erstellten Trainingsaufenthalt auf der Seite.
Was ist der beste Weg, um den verworfenen Kind Datensatz loszuwerden?
UPDATE:
ich ein jsFiddle erstellt haben Problem zu reproduzieren, aber es funktionierte. Im Gegensatz zu meiner Anwendung hier verwendete ich DS.FixtureAdapter
: http://jsfiddle.net/tothda/LaXLG/13/
Dann habe ich eine andere erstellt DS.RESTAdapter
verwenden und das Problem aufgetaucht: http://jsfiddle.net/tothda/qwZc4/5/
In der Geige versuchen: Bearbeiten, neue hinzufügen und dann auf Zurücksetzen.
Ich fand heraus, dass im Falle des RESTAdapter, wenn ich einen neuen Kind-Datensatz zu einer hasMany
Beziehung hinzufügen, der Eltern-Datensatz nicht schmutzig werden. Was scheint in Ordnung, aber wenn ich die Transaktion Rollback, bleibt der neu erstellte Kind-Datensatz in der ManyArray
des Elternteils.
Ich weiß immer noch nicht, was ist der beste Weg, um mit der Situation umzugehen.
Dies ist eine nette Idee, aber es scheint, wie jetzt meine Anwendung alle Asynchron relationsships sofort wird geladen (was eine Weile dauert), anstatt zu warten, bis die tatsächlich benutzt werden? Korrigiere mich, wenn ich falsch liege. – justastefan
@justastefan, gute Beobachtung. saveOriginalRelations lädt wahrscheinlich alle asynchronen Beziehungen. Wenn Sie asynchrone Beziehungen haben, ist es schwieriger, diese Technik zu implementieren. Sie müssen die ursprünglichen Beziehungen erst speichern, nachdem sie geladen wurden, und das Zurücksetzen nicht geladener Beziehungen ignorieren. –
Während der Aktualisierung auf ember-data 1.13.7 habe ich [versucht zu aktualisieren] (https://gist.github.com/masciugo/0e2eee85a42b13fac9e3) diese Problemumgehung zu, aber keinen Erfolg. Kannst du mir bitte helfen? – masciugo