最后,我创建了一个具有 2 个不同 UIRenderer 的自定义单元格。根据 DTO 中的标志,我们可以决定使用什么渲染器。每个单元格类型都在 xml 中定义。
public class DualFaceCell extends AbstractCell<DTO> {
@UiTemplate("SimpleFaceCell.ui.xml")
interface SimpleFaceRenderer extends UiRenderer {
void render(SafeHtmlBuilder sb);
void onBrowserEvent(SimpleFaceCell o, NativeEvent e, Element p);
}
@UiTemplate("ComplexFaceCell.ui.xml")
interface ComplexFaceRenderer extends UiRenderer {
void render(SafeHtmlBuilder sb, String name);
void onBrowserEvent(ComplexFaceCell o, NativeEvent e, Element p);
}
private final SimpleFaceRenderer simpleRenderer = GWT.create(SimpleFaceRenderer .class);
private final ComplexFaceRenderer complexRenderer = GWT.create(ComplexFaceRenderer .class);
public DualFaceCell() {
super(BrowserEvents.CLICK);
}
@Override
public void render(Context context, DTO value, SafeHtmlBuilder sb) {
if (value.isSimpleFaceCell()) {
simpleRenderer.render(sb);
} else {
complexRenderer.render(sb, value.getName());
}
}
不幸的是, UIHandler 不再可用。即使我已经在 xml 和 ui:field = "add" 中声明,如果我们想用如下注释处理它的动作:
@UiHandler({ "add" })
void onAddClicked(ClickEvent event, Element parent) {
Window.alert("Add clicked");
}
显示以下错误:
"add" is not a known field name as listed in the @UiHandler annotation in "void onAddListClicked(com.google.gwt.event.dom.client.ClickEvent event, com.google.gwt.dom.client.Element parent)" of com.bla.bla.client.view.DualFaceCell
你知道如何欺骗 UIHandler 正常工作吗?