Jak wycofać zmiany relacji w EmberData
Mam dwa modele z relacją rodzic-dziecko: trening i ćwiczenia:
App.Training = DS.Model.extend({
exercises: DS.hasMany('App.Exercise')
})
App.Exercise = DS.Model.extend({
training: DS.belongsTo('App.Training')
})
Chcę mieć stronę, na której wyświetlane jest szkolenie ze wszystkimi powiązanymi ćwiczeniami. Jeśli użytkownik naciśnieEdit
przycisk, strona staje się edytowalna z możliwością dodawania nowych ćwiczeń. Chcę też miećCancel
przycisk, który odrzuca wszystkie wprowadzone zmiany.
Oto mój kontroler:
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({});
}
})
W kontrolerze są cztery programy obsługi zdarzeń:
edit
: Użytkownik nacisnąłEdit
przycisk: transakcja zostaje utworzona, strona przechodzi w tryb „Edycja”.cancel
: Użytkownik nacisnąłCancel
przycisk: transakcja jest cofnięta i przywrócona do trybu „Normalny”.save
: Użytkownik nacisnąłSave
przycisk: transakcja zostaje zatwierdzona i powraca do trybu „Normalny”.addExercise
: Użytkownik nacisnąłAdd exercise
przycisk: nowe ćwiczenie jest tworzone (w tej samej transakcji) i dodawane do szkoleń.Funkcja wycofywania działa dobrze z wyjątkiem nowo utworzonych rekordów: jeśli pchnęEdit
przycisk, dodaj nowe ćwiczenie i naciśnijCancel
przycisk, nowo utworzone ćwiczenie pozostaje na stronie.
Jaki jest najlepszy sposób na pozbycie się odrzuconego rekordu dziecka?
AKTUALIZACJA:
Stworzyłem jsFiddle, aby odtworzyć problem, ale zadziałało. W przeciwieństwie do mojej aplikacji tutaj użyłemDS.FixtureAdapter
: http://jsfiddle.net/tothda/LaXLG/13/
Następnie stworzyłem inny używającDS.RESTAdapter
i pojawił się problem:http://jsfiddle.net/tothda/qwZc4/5/
W skrzydle spróbuj: Edytuj, Dodaj nowy, a następnie Wycofaj.
Zorientowałem się, że w przypadku RESTAdapter, gdy dodam nowy rekord potomny do ahasMany
związek, rekord rodzica nie będzie brudny. Co wydaje się w porządku, ale kiedy wycofuję transakcję, nowo utworzony rekord dziecka pozostaje w rodzicachManyArray
.
Nadal nie wiem, jaki jest najlepszy sposób radzenia sobie z sytuacją.