GWTP: правильный поток информации для докладчика
У меня была эта задача: у меня есть пара Presenter/View (давайте назовем это ItemListPresenter), показывающая Celltable. Теперь я хотел отредактировать элемент, дважды щелкнув по нему (или нажав кнопку, что угодно). Затем должен появиться всплывающее диалоговое окно (давайте назовем его PopupWidget), позволяющее мне редактировать свойства моего элемента. Я нашел решение, как это сделать, но я не уверен, что это "правильный" путь. Поскольку я пытаюсь изучить философию, лежащую в основе GWT/GWTP, я был бы признателен, если бы вы дали мне подсказки, что я сделал правильно и что я сделал неправильно
В методе onbind ItemListPresenter я связываю CellTable с обработчиком DoubleClick:
getView().getCellTable().setSelectionModel(selectionModel);
getView().getCellTable().addDomHandler(new DoubleClickHandler() {
@Override
public void onDoubleClick(final DoubleClickEvent event) {
DeviceDto selectedDeviceDto = selectionModel.getSelectedObject();
//TODO: Figure out how to best handle editing of DeviceDto
if (selectedDeviceDto != null) {
devicesDialog.setCurrentDeviceDTO(selectedDeviceDto);
addToPopupSlot(devicesDialog);
}
} }, DoubleClickEvent.getType());
То, что не кажется правильным, это установка объекта, который я хочу редактировать (selectedDeviceDto), в виджете Dialog Presenter. Это "правильный" путь?
Мой всплывающий докладчик, который определяется как
public class DeviceEditDialogPresenterWidget extends PresenterWidget<DeviceEditDialogPresenterWidget.MyView> implements
DeviceEditDialogUiHandlers {
все еще безобразно, так как я просто устанавливаю каждое свойство в текстовое поле и после редактирования я вспоминаю свойства и перестраиваю объект. Это грязно, и я думаю, я должен GWT Editors для этого. Однако, когда я нажимаю кнопку "Сохранить" в диалоговом окне, запускается UiHandler:
@UiHandler("okButton")
void okButtonClicked(ClickEvent event) {
DeviceDto dev = new DeviceDto(idBox.getText(), deviceIdBox.getText(), typeBox.getText(), firmwareVersionBox.getText(), userBox.getText(), statusBox.getText());
getUiHandlers().updateDevice(dev);
hide();
}
Это вызывает мой DeviceEditDialogPresenterWidget, который сам запускает и событие:
@Override
public void updateDevice(DeviceDto device) {
eventBus.fireEvent(new DeviceUpdatedEvent(device));
}
Это событие перехватывается обработчиком в "материнском" презентаторе с CellTable, который снова подключается в методе onBind:
addRegisteredHandler(DeviceUpdatedEvent.TYPE, new DeviceUpdatedEvent.DeviceUpdatedHandler() {
@Override
public void onDeviceUpdatedEvent(DeviceUpdatedEvent event) {
updateDevice(event.getDevice());
}
});
Я действительно хотел бы избежать путаницы с ошибками, поэтому любые советы будут оценены.
Спасибо Артур
1 ответ
PresenterWidgets
обычно предназначены для того, чтобы иметь setter
который используется для установки Model
или же DTO
что PresenterWidget
работает (так же, как вы это сделали).
В качестве альтернативы вы можете избежать PresenterWidget
и использовать Editor
(расширяет составной), который вы вручную добавляете в PopupPanel
или же DialogBox
в вашем ListItemEditor
,
Таким образом, вы избежите сложности PresenterWidget
, Но вы должны обрабатывать клики (т.е. кнопку сохранения) из ListItemPresenter
, Я всегда буду пытаться начать с малого (использовать композитный), и если вы понимаете, что вам может понадобиться функциональность и в других местах, создайте PresenterWidget
,
Также вам не нужно updateDevice
метод, потому что вы передаете ссылку на ваш DTO
, Вам нужно только освежить CellTable
,
Но кроме этого ваш подход выглядит хорошо.