Несохраненная модель ember-data не удаляется при переходе назад кнопкой назад
У меня есть приложение ember с моделью данных и обычными представлениями / маршрутами / контроллерами CRUD для перечисления и добавления новых элементов.
Когда я нажимаю "добавить новое" на странице индекса, я получаю ожидаемую форму с кнопками "Сохранить" и "Отмена". Если я нажимаю "Отмена", представление возвращается к представлению индекса, и модель не сохраняется, как ожидалось.
Это код контроллера новых предметов:
App.ItemsNewController = Ember.ObjectController.extend({
actions: {
saveChanges: function() {
this.model.save();
this.transitionTo('items');
},
cancel: function() {
this.model.rollback(); // how to run this when the back button is pressed?
this.transitionTo('items');
},
},
});
Но если я нажму кнопку "Назад", я тоже окажусь на странице индекса, но в списке индекса появится дополнительная пустая строка, соответствующая новой записи, которая не была сохранена в "новом" представлении. Эта запись не была сохранена на уровне данных, но она каким-то образом все еще существует в памяти, и this.store.find('items')
возвращает коллекцию, которая включает его. Если я обновлю страницу, пустая строка исчезнет. Также, как указано выше, если я выхожу из формы с помощью кнопки отмены, запись отбрасывается, потому что в методе действия "отмена" я вызываю this.model.rollback()
,
Итак, в итоге, я думаю, мне придется откатить модель, когда нажата кнопка "Назад", но я не знаю ни одного обратного вызова маршрута, чтобы связать некоторый код с этим событием.
Если это важно, я использую Ember 1.9.1, Ember Data 1.0.0-beta.15-canary, Handlebars 2.0.0, jQuery 1.10.2
1 ответ
Что ж, это второй раз подряд, когда я публикую сообщение в stackru, и вскоре после этого я нахожу ответ, так что, думаю, мне следует воздержаться от вопросов здесь, если я буквально не знаю и безнадежен;)
Благодаря этому другому вопросу, я узнал, что есть exit
Событие на маршруте. Таким образом, ключ для решения этой проблемы находится на маршруте, а не в контроллере. В итоге я поместил откат модели в метод события выхода маршрута, как показано ниже:
ОБНОВЛЕНИЕ: @ NicholasJohn16 указывает, что лучше использовать deactivate
крюк вместо exit
, Подробности смотрите в комментариях ниже. Пример кода был изменен соответственно.
App.ItemsNewRoute = Ember.Route.extend({
model: function() {
return this.store.createRecord('item', {
title: 'Untitled',
status: 'new',
});
},
deactivate: function() {
model = this.controllerFor('notifications.new').get('model');
model.rollback();
},
});
Как только это будет сделано, вы даже можете удалить model.rollback()
вызовите от действия отмены в контроллере и оставьте только transitionTo('items')
вызов. Поскольку маршрут deactivate
Событие всегда будет вызываться, независимо от того, как вы покидаете представление, модель всегда будет отбрасываться.