Позвольте мне начать с того, что у меня есть решение, но на самом деле я не думаю, что он изящный. Итак, я ищу более чистый способ сделать это.RequestFactoryEditorDriver получает отредактированные данные после флеша
У меня есть EntityProxy, отображаемый на панели просмотра. Панель просмотра является RequestFactoryEditorDriver только с использованием режима отображения. Пользователь нажимает на элемент данных и открывает всплывающий редактор для редактирования элемента данных EntityProxy с еще несколькими битами данных, чем отображается на панели просмотра. Когда пользователь сохраняет элемент, мне нужна панель просмотра для обновления дисплея.
У меня возникла проблема, потому что RequestFactoryEditorDriver из потока всплывающих окон не позволяет вам перейти к редактируемым данным. Драйвер использует тот же самый переданный в контексте, который вы используете для отправки данных сервером. Однако контекст, возвращенный из флеша, разрешает только Receiver<Void>
, даже если вы применили его к типу контекста, который вы сохранили в драйвере редактора при вызове edit() , [Он также не отправляет и событие EntityProxyChanged, поэтому я не смог его прослушать и обновил отображение. - поцарапайте это - теперь я вижу это событие не для этого случая использования]
Решение, которое я нашел, состояло в том, чтобы изменить объект моего домена, чтобы вернуть вновь сохраненный объект. Затем создайте редактор всплывающую как этот
editor.getSaveButtonClickHandler().addClickHandler(createSaveHandler(driver, editor));
// initialize the Driver and edit the given text.
driver.initialize(rf, editor);
PlayerProfileCtx ctx = rf.playerProfile();
ctx.persist().using(playerProfile).with(driver.getPaths())
.to(new Receiver<PlayerProfileProxy>(){
@Override
public void onSuccess(PlayerProfileProxy profile) {
editor.hide();
playerProfile = profile;
viewDriver.display(playerProfile);
}
});
driver.edit(playerProfile, ctx);
editor.centerAndShow();
Тогда в обработчике я экономлю только огонь() контекст, я получаю от флеша(). Хотя этот подход работает, это кажется неправильным. [Казалось бы, я должен подписаться на событие entitychanged в представлении отображения и обновить сущность и представление оттуда. - еще раз поцарапать, по той же причине, что и раньше] Также этот подход сохраняет полный объект, а не только измененные биты, что увеличит использование полосы пропускания.
Что бы я подумал, должно произойти, когда вы очищаете объект, он должен «оптимистично» обновить управляемую версию управляемой версии объекта и запустить событие изменения прокси-сервера объекта. Только возврат объекта, если что-то пошло не так в сохранении. Фактическое сохранение должно отправлять только измененные биты. Таким образом, нет необходимости возвращать весь объект и отправлять эти полные данные по кабелю дважды.
Есть ли лучшее решение?
Спасибо за ваш ответ, но я не уверен, где вы думаете, что я перепутал флеш и огонь. Я использовал их точно так, как вы описали. Также в RequestFactoryEditorDriver flush возвращает rf-контекст, с которым вы его инициализировали, а не отредактированный объект, который не позволяет вашему третьему варианту быть возможным (если только не существует какого-либо доступа, который я не нашел). Также, глядя на отправленный HTTP-запрос, весь объект отправляется на сервер не только с дельтами, что отличается от способа документирования rf. И условие, которое вы дали, когда событие EntityProxyChange является условием ... – Deanna
Я рассмотрел ваш вариант 1, но, как вы отметили, это дополнительная поездка на сервер. Я использовал вариант 2, но он работает не так, как ожидалось, поскольку он не отправляет diff. До того, как этот процесс начался, объект уже был на сервере и появился на панели просмотра. Это файл playerProfile, на который я ссылаюсь в примере кода. Я использую это для инициализации RequestFactoryEditorDriver, поэтому я ожидаю, что событие сработает (firewall eventbus firef), когда драйвер покраснеть и/или исходный прокси обновится. Упускаю ли я что-то, что мешает этим? – Deanna
Кроме того, я не полностью использовал случай использования entityproxy только в качестве моментального снимка, когда вы его схватили. В этом вы правы. Я думал, что это нечто более функциональное, как удаленная/клиентская копия объекта, которая будет обновлена, если я возьму новую копию того же объекта с сервера и отправит событие entityproxychange. – Deanna