我有一个在Uibinder中使用的Inlinelabel子类。我如何通过杜松子酒将PlaceController注入其中,以便可以在Uibinder中使用小部件? (回想一下Uibinder需要一个no-args构造函数。)

如果不可能,那么将placecontroller的最干净的方法是什么,以便在onclick()事件中可以被窗口小部件使用?

编辑:

在这种情况下,我不确定MVP确实是最好的解决方案(我很高兴您改变主意。)

我将在我的uibinder foo.ui.xml文件中声明数十个Inlinelabel实例。如果我实现MVP,则意味着在视图中将这些实例中的每一个声明为@Uifield成员。当我有很多人时,这变得相当笨拙。这就是为什么我希望以半自动化的方式将PlaceController注入每个Inlinelabels,并避免必须手动将它们连接到视图中。

如果有一种方法可以将演示者注入每个Inlinelabels ...那么代表团可以做类似:

   public class MyInlineLabelSubclass {
       // ...

       public void onClick(ClickEvent event)
       {
         presenter.labelClicked(this);
       }
    }
有帮助吗?

解决方案

您可以使用 @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-将视图的主持人委托(通过。回调或演示者界面)。看 http://code.google.com/webtoolkit/doc/latest/devguidemvpactivitiesandplaces.html#views

其他提示

我已经在网上看到了一个示例,其中直接从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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top