ember.js отбросьте созданную модель, если она не сохраняется

#javascript #ruby-on-rails #ember.js

#javascript #ruby-on-rails #ember.js

Вопрос:

Я выполнил 3 части руководства здесь, и все работает нормально, за одним исключением. Когда я перехожу на страницу «Добавить книгу», а затем перехожу к разделу «Список книг» без сохранения, список книг расширяется на пустой элемент. Я подозреваю, что причиной является следующий код, в котором новая модель создается перед сохранением и не удаляется, если не сохраняется форма. Есть идеи, как это исправить?

 Embertest.BooksNewRoute = Ember.Route.extend({
  model: function() {
    return this.get('store').createRecord('book');
  },
  actions: {
    create: function() {
      var newBook = this.get('currentModel');
      newBook.save();
      this.transitionTo('books');
    }
  }
});
  

Ответ №1:

Из http://emberjs.com/api/classes/Ember .Route.html#метод_deactivate

Добавьте deactivate функцию в свой маршрут. Это вызывается перед выходом из этого текущего маршрута. Таким образом, вы можете откатить запись, которую вы только что создали в модели, следующим образом:

 model: function(params) {
    return this.get('store').createRecord('book');
},

deactivate: function() {
    this.currentModel.rollback();
},
  

Комментарии:

1. У меня это не работает — деактивация не вызывается, если я перемещаюсь со страницы.

2. Вы уверены, что поместили ее в маршрут?

3. ДА. Я предполагаю, что это не работает, потому что я как бы остаюсь на том же маршруте при переходе из-за вложенных ресурсов (т. Е. /posts/new -> /posts ).

4. затем вы можете просто добавить приведенный выше код в /posts/new.js маршрут. Это работает для меня с моей стороны.

Ответ №2:

Я решил это, присоединив действие для уничтожения записи к событию willTransition, как показано ниже. Кто-нибудь прокомментирует, правильный ли это подход?

 Embertest.BooksNewRoute = Ember.Route.extend({
  model: function() {
    return this.get('store').createRecord('book');
  },
  actions: {
    willTransition: function() {
      if (this.currentModel.get('isNew')) {
          this.get('currentModel').deleteRecord();
      };  
    },
    create: function() {
      var newBook = this.get('currentModel');
      newBook.save();
      this.transitionTo('books');
    }
  }
});