ExtJS3 - предотвращение перезаписи моделей, которые не были правильно загружены - PullRequest
0 голосов
/ 21 марта 2012

Какова принятая стратегия для обеспечения того, чтобы модели, загруженные с сервера, а затем впоследствии измененные в пользовательском интерфейсе (т.е. ExtJS) и отправленные обратно на сервер, были сохранены правильно?

Проблема, которую мы видим в приложении, заключается в том, что модели могут быть сохранены без их правильной загрузки. Это может привести к сохранению неполных моделей.

например. На сервере модель имеет следующие свойства:

color: blue
size: 10
weight: 20

Пользователь загружает модель, а в процессе загрузки пользователь меняет

color: red

и сохраняет. В результате модель теряет свои весовые и размерные свойства на сервере. Обратите внимание, что это радикальное упрощение нашего сценария. Модели намного сложнее, а объем данных намного больше.

Стратегии, которые я могу придумать:

  1. Убедитесь, что все загружено, прежде чем разрешить пользователям сохранять (я думаю, что это не элегантно).
  2. Отслеживайте изменения в модели, сохраняйте только изменения. Это не потребует полной загрузки модели, поскольку только те вещи, которые пользователь активно редактирует, сохраняются обратно на сервер (не знаю, поддерживается ли это в ExtJS из коробки).

Может ли кто-нибудь указать мне правильное направление? Можно ли использовать Ext.data.Record.getChanges / isModified для реализации второго подхода? Как ExtJS обрабатывает удаления?

1 Ответ

0 голосов
/ 21 марта 2012

Когда вам нужно сохранить модель, которая никогда не была сохранена, вы делаете это:

model.save();

Этот метод автоматически вызывает метод Ext.data.proxy.Proxy .create().

Если вам нужно обновить модель некоторыми свежими данными или даже заменить существующие данные, вы делаете это:

model.set('property', 'value');

Этот, с другой стороны, автоматически вызывает метод Ext.data.proxy.Proxy .update().

Затем вы можете работать с константами класса модели, ссылаясь на статус действия:

  • Ext.data.Model.EDIT
  • Ext.data.Model.REJECT
  • Ext.data.Model.COMMIT

@ charris приводит хороший пример комментария к официальным документам:

var myStore = Ext.create('Ext.data.Store', {
  model: 'MyApp.model.MyModel',
  listeners: {
    update: function(store, model, operation, eventOptions) {
      if( operation == Ext.data.Model.EDIT ) {
          // Model was edited but not saved...
      }
      else if( operation == Ext.data.Model.COMMIT ) {
          // Model was saved...
      }
    }
  }
});

Может быть, это поможет вам.

...