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,
Но кроме этого ваш подход выглядит хорошо.

Другие вопросы по тегам