我有一个在UIBinder中使用的InlineLabel子类。如何通过GIN将PlaceController注入其中,以便可以在UIBinder中使用该窗口小部件? (回想一下,UIBinder需要一个no-args构造函数。)
如果这不可能,那么最简单的方法是让PlaceController可用于窗口小部件,以便在onClick()事件期间窗口小部件可以使用它?
修改
我不确定MVP在这种情况下是否真的是最好的解决方案(不过我很高兴让你改变主意。)
我将在我的UIBinder foo.ui.xml文件中声明几十个这些InlineLabel实例。如果我实现MVP,则意味着在视图中将每个实例声明为@UiField成员。当我有这么多时,这变得相当笨拙。这就是为什么我希望以半自动方式将PlaceController注入每个InlineLabel,并避免必须手动将它们连接到视图中。
如果有一种方法可以将演示者注入每个InlineLabels中,那么也可以接受......然后代理可以这样做:
public class MyInlineLabelSubclass {
// ...
public void onClick(ClickEvent event)
{
presenter.labelClicked(this);
}
}
答案 0 :(得分:0)
您可以使用@UiHandler
注释向UiBinder元素添加处理程序,而无需@UiField
引用:
<ui:UiBinder>
<g:InlineLabel ui:field="name"/>
<g:InlineLabel ui:field="address"/>
<g:InlineLabel ui:field="zipCode"/>
</ui:UiBinder>
在视图中:
@UiHandler({"name","address","zipCode"})
void onClick(ClickEvent event) {
// Source will be one of the three InlineLabels.
presenter.labelClicked(event.getSource());
}
不要让您的窗口小部件直接处理PlaceController - 委托给视图的Presenter(通过。回调或Presenter接口)。见http://code.google.com/webtoolkit/doc/latest/DevGuideMvpActivitiesAndPlaces.html#Views
答案 1 :(得分:0)
我在网上看到了一个例子,其中超链接是直接从PlaceController使用的名称标记构建的。例如
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:with type="com.gwtplatform.samples.nested.client.NameTokens" field="nameTokens"></ui:with>
<g:HTMLPanel>
<g:InlineHyperlink targetHistoryToken="{nameTokens.getHomePage}">Home</g:InlineHyperlink> |
<g:InlineHyperlink targetHistoryToken="{nameTokens.getAboutUsPage}">About Us</g:InlineHyperlink> |
<g:InlineHyperlink targetHistoryToken="{nameTokens.getContactPage}">Contact</g:InlineHyperlink>
</g:HTMLPanel>
</ui:UiBinder>
有关此示例的更多信息,请参阅此处:
http://code.google.com/p/gwt-platform/wiki/SimpleNestedSample#Step_3:_Creating_a_custom_widget