我有这个任务:我有Presenter/View Couple(让我们称之为ItemListPresenter)显示一个Celltable。现在我想编辑一个项目通过双击它(或按下一个按钮,无论)。然后应该出现一个弹出对话框(我们称之为PopupWidget),让我编辑我的项目属性。我找到了一个解决方案,但我不确定这是"正确"的方式。因为我正在努力学习GWT/GWTP背后的哲学,如果你能给我提示我做对了什么,做错了什么,我将不胜感激:
在ItemListPresenter的onbind方法中,我用一个DoubleClick处理程序连接了CellTable:
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)。这是"正确"的方式吗?
我的弹出式演示器,定义为
public class DeviceEditDialogPresenterWidget extends PresenterWidget<DeviceEditDialogPresenterWidget.MyView> implements
DeviceEditDialogUiHandlers {
仍然很难看,因为我只是将每个属性设置到一个文本框中,编辑后,我重新收集属性并重新构建对象。这是混乱的,我想我应该GWT编辑器。但是,当我点击对话框中的"保存"按钮时,会触发一个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());
}
});
我真的很想避免走上混乱的错误之路,所以任何提示都会很感激。
谢谢亚瑟
PresenterWidgets
通常被设计为具有用于设置PresenterWidget
工作的Model
或DTO
的setter
(与您所做的方式相同)。
或者,您可以避免PresenterWidget
并使用Editor
(扩展复合),您手动添加到ListItemEditor
中的PopupPanel
或DialogBox
。
这样可以避免PresenterWidget
的复杂性。但你必须处理点击(即保存按钮)从ListItemPresenter
。我总是尝试从小处开始(使用复合),如果你意识到你可能在其他地方也需要这个功能,创建一个PresenterWidget
。
您也不需要updateDevice
方法,因为您传递了对DTO
的引用。你只需要刷新CellTable
。
但除此之外,你的方法看起来不错。