2014-10-27 2 views
0

У меня есть приложение, которое широко использует редактор Framework. Прямо сейчас я нахожусь в точке, где хочу добавить новую функцию: если пользователь редактирует объект, я хотел бы записать, какие изменения были внесены, и сохранить их в отдельном объекте хранилища данных. Для этого требуется знание, было ли изменено поле, имя поля и значение, на которое оно было изменено.Редакторы GWT: как записывать изменения в полях и субредакторах? (RequestFactory?)

Это то, что я хотел бы реализовать:

  1. App требует редактирования (фасоль);
  2. Пользователь вносит изменения, вызывает flush(), и данные отправляются обратно на сервер.
  3. В обработчике сервера изменения из компонента отправляются на processChanges(List<String> paths), который затем создает и сохраняет запись, в которой поле «foo» было изменено на «bar» и т. Д.
  4. Сущность сохраняется, перезаписывая существующий.

Я использую GWTP и в настоящее время использую шаблон команды RPC. Я читал немного о RequestFactory, и, как я понимаю, одним из его основных преимуществ является то, что он отправляет измененные поля, известные как «deltas», обратно на сервер, чтобы свести к минимуму полезную нагрузку, поэтому мне интересно, будет ли использование RequestFactory лучше подходит для моего приложения?

Извинения. Я читал документы GWT и Javadocs для редактора Framework и RequestFactory, но я все еще довольно смущен. RequestFactoryEditorDriver.getPaths() кажется, что это может быть то, что мне нужно, но любые советы или указатели очень ценятся.

Возможно, я мог следить за изменениями на стороне клиента, но это похоже на плохую идею.

+0

Я не вижу 100% того, как это связано с GWT Editors специально или GWT вообще. Звучит скорее как реструктуризация проблемы с базой данных/хранилища данных, например. сохраняя историю объекта. –

+0

Я думаю, вы неправильно поняли мою проблему. Как реструктурирует мою схему, чтобы помочь мне узнать, какие поля изменили их содержимое, когда я называю 'EditorDriver.flush()'? Я повторно сохраняю одну и ту же сущность, но не каждый раз создаю новую копию, поэтому необходимо записывать изменения отдельно. – slugmandrew

ответ

2

Я считаю, что вы можете сделать это, используя EditorVisitor, аналогично посетителю, который используется внутренне с помощью рамки редактора (см. PathCollector, как собирать маршруты у посетителя).

Я хотел бы начать с посещения иерархии собирать начальные значения только после вызова edit() (это делается уже на DirtCollector внутренне, но никакого способа получить доступ к его результатам, и он собирает только значения листьев все равно).
Тогда вы можете позвонить flush() и посмотреть, есть ли ошибки, и, возможно, подтвердил ваш объект, чтобы узнать, все ли в порядке. Затем вы снова посещаете иерархию, чтобы собирать изменения (против начальных значений, которые вы ранее собрали), чтобы вы могли отправить их на сервер.

+0

Спасибо Томас. Кажется, что это простая задача, поэтому я собираюсь оставить ее на данный момент. В какой-то момент я буду рефакторировать весь код привязки данных, поэтому, возможно, я поеду на requestfactory, тогда как это кажется действительно полезным. – slugmandrew

+0

Мой ответ никоим образом не связан с RequestFactory, это ** только ** с использованием среды редактора. –

+0

Я так понимаю, но не было бы легче отслеживать имена полей и какие из них были отредактированы с использованием прокси-серверов 'RequestFactory', а не с помощью' EditorVisitor', чтобы самим пересечь дерево? – slugmandrew