Как откатить изменения отношений в EmberData
У меня есть две модели отношений между родителями и детьми: тренировка и тренировка:
App.Training = DS.Model.extend({
exercises: DS.hasMany('App.Exercise')
})
App.Exercise = DS.Model.extend({
training: DS.belongsTo('App.Training')
})
Я хочу иметь страницу, где отображается тренировка со всеми связанными с ней упражнениями. Если пользователь нажимаетEdit
Кнопка, страница становится редактируемой с возможностью добавления новых упражнений. Я тоже хочу иметьCancel
кнопка, которая отменяет все сделанные изменения.
Вот мой контроллер:
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({});
}
})
В контроллере есть четыре обработчика событий:
edit
: Пользователь нажалEdit
кнопка: транзакция создана, страница помещена в "Редактирование» Режим.cancel
: Пользователь нажалCancel
кнопка: транзакция откатывается назад и обратно на "Нормальный" Режим.save
: Пользователь нажалSave
кнопка: транзакция совершена и возвращается кНормальный" Режим.addExercise
: Пользователь нажалAdd exercise
Кнопка: создается новое упражнение (в той же транзакции) и добавляется в тренинги.Функция отката работает нормально, за исключением вновь созданных записей: если я нажмуEdit
добавьте новое упражнение и нажмитеCancel
Кнопка, только что созданное упражнение остается на странице.
Каков наилучший способ избавиться от сброшенной записи о ребенке?
UPDATE: Я
Мы создали jsFiddle для воспроизведения проблемы, но это сработало. В отличие от моего приложения здесь я использовал:DS.FixtureAdapter
http://jsfiddle.net/tothda/LaXLG/13/
Затем я'мы создали другой, используяDS.RESTAdapter
и проблема обнаружилась:http://jsfiddle.net/tothda/qwZc4/5/
В скрипте попробуйте: Edit, Add new и затем Rollback.
Я понял, что в случае RESTAdapter, когда я добавляю новую дочернюю запись вhasMany
отношения, родительский отчет выигралгрязный. Это выглядит нормально, но когда я откатываю транзакцию, вновь созданная дочерняя запись остается в родительской записи.ManyArray
Я до сих пор нене знаю, чтоЭто лучший способ справиться с ситуацией.