我想通过使用编辑器来绑定POJO来改进我的gwt项目的代码,我曾经手动地来回解析小部件。但是我发现documentation令人困惑,主要是因为它引用了ui binder,这是我还没想到的另一个功能。
使用没有ui binder的编辑器是否有意义?我的ParentDTO包含许多childDTO。下面的代码片段展示了我如何尝试将TextArea扩展的一些ChildEditors嵌套到我的ParentEditor中(试图将其删除到基本要素):
public class MyEditorPage {
// editors
class ParentDTOEditor implements Editor<ParentDTO> {
Integer dataBaseId;
List<ChildDTOEditor> childs;
public void attach(RootPanel rootPanel) {
for (ChildDTOEditor widget : childs) {
rootPanel.add(widget);
}
}
}
class ChildDTOEditor implements Editor<ChildDTO> extends TextArea {}
// driver
interface Driver extends SimpleBeanEditorDriver<ParentDTO, ParentDTOEditor> {}
Driver driver = GWT.create(Driver.class);
// load set widgets to the root panel
public void loadPage(RootPanel rootPanel) {
// get pojos from server
myService.getSuff(...
...
public void onSuccess(ParentDTO result) {
ParentDTOEditor editor = new ParentDTOEditor();
driver.initialize(editor);
driver.edit(result);
editor.attach(rootPanel);
}
}
// save
public void save() {
ParentDTO dto = driver.flush();
... // call myService.saveStuff(dto,...
}
}
我是否需要单独的编辑器或只是ListEditor类型的父编辑器直接保存子dtos?
答案 0 :(得分:1)
使用没有ui活页夹的编辑器是否有意义?
是的,这些功能是独立的,每个功能都可以在没有其他功能的情况下使用。
我是否需要单独的编辑器或只需
ListEditor
类型的父编辑器直接保存子dtos?
您可以直接创建ListEditor
实施,但如果您通过扩展Editor<ChildDTO>
并使用{{1}告诉它如何创建和销毁EditorSource<ChildDTOEditor>
,GWT可以为您做到这一点}
这是一个不错的例子here,但我会在这里提出最低限度的实施。
ListEditor.of(new YourChildDTOEditorSourceImpl())
现在您可以创建一个编辑器驱动程序并像使用普通编辑器一样使用它,但是将其传递给列表。
public class FooEditor extends Composite implements Editor<Foo> {
// Implement one of uibinder+fields, fields, methods, or LeafValueEditor.set/getValue()
public FooEditor() {
initWidget(/* root widget or call to uiBinder.createAndBindUi(this) */)
}
}
public class FooListEditor extends Composite implements IsEditor<ListEditor<Foo, FooEditor>> {
private class FooEditorSource extends EditorSource<FooEditor> {
@Override
public FooEditor create(int index) {
FooEditor subEditor = new FooEditor();
// any additional per-item config can go here, e.g wiring up delete handler
listPanel.insert(subEditor, index);
return subEditor;
}
@Override
public void dispose(FooEditor subEditor) {
subEditor.removeFromParent();
}
@Override
public void setIndex(FooEditor subEditor, int index) {
listPanel.insert(subEditor, index);
}
}
// FlowPanel or anything else you want to use to hold the sub-editors.
// Instantiated explicitly or through uibinder.
FlowPanel listPanel = new FlowPanel();
// Let GWT handle the ListEdiotr implementation
ListEditor<Foo, FooEditor> editor = ListEditor.of(new FooEditorSource());
public FooListEditor() {
initWidget(listPanel /* or uiBinder.createAndBindUi(this) */);
}
@Override
public ListEditor<Foo, FooEditor> asEditor() {
return editor;
}
}