У меня есть модели, определяемые как:
App.Answer = DS.Model.extend({
name: DS.attr('string'),
layoutName: DS.attr('string')
});
App.Question = DS.Model.extend({
name: DS.attr('string'),
answers: DS.hasMany('answer', {async: true})
});
У меня есть компонент, который позволяет удалять и добавлять ответы на вопросную модель. Компонент поставляется с кнопкой приложения и отмены, и когда пользователь нажимает на отмену, я хотел, чтобы все изменения (добавления/удаления ответов) были отменены. В настоящее время откат не делает трюк, я событие пробовал model.reload() при использовании адаптера отдыха, и это тоже не сработало для меня. Любая идея, как я могу сделать откат в этой ситуации?
При использовании адаптера для отдыха я в значительной степени опускаю проблему, указанную здесь: Объект отмены EmberJS (отката) с HasMany
Спасибо, Dee
ОБНОВЛЕНИЕ:
Так как я не мог выполнить откаты предполагаемым способом, я выполнил следующие шаги:
1) get all the answers back from the server
2) remove answer association from the question
3) manually add answer association to the question model from data received from server
Кажется, что это хорошо работает, но, к сожалению, я получаю эту ошибку, которую я не могу стряхнуть.
Вот jsbin обновленного хода: http://jsbin.com/uWUmUgE/2/
Здесь вы можете создать новый ответ, а затем добавить его к вопросу и выполнить откат. НО, если вы выполните следующие шаги, вы увидите проблему, с которой я сталкиваюсь:
1) delete an answer
2) add an answer
3) perform rollback
4) add an answer
Он выдает эту ошибку:
Ошибка: попытка обработать событие didSetProperty
при включенном состоянии root.deleted.uncommitted. Вызывается с помощью {name: position, oldValue: 1, originalValue: 1, value: 2}.
Я буду ценить любую помощь, которую вы можете предоставить.
обходным:
Один простой способ - просто скрыть ответы на удаление. Я немного изменил модель:
App.Answer = DS.Model.extend({
name: DS.attr('string'),
layoutName: DS.attr('string'),
markToDelete: DS.attr('boolean', {default: false})
});
И моя функция отката имела такую логику:
answers.forEach(function (answer) {
if(!answer.get('id')){
//newly created answer models that has not persisted in DB
question.get('answers').removeObject(answer);
answer.deleteRecord();
} else {
answer.rollback();
}
});