Несохраненная модель 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 Событие всегда будет вызываться, независимо от того, как вы покидаете представление, модель всегда будет отбрасываться.

Другие вопросы по тегам