GWT& GIN:如何使用UIBinder将PlaceController注入到窗口小部件中

时间:2011-01-19 19:50:09

标签: gwt dependency-injection uibinder gin

我有一个在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);
       }
    }

2 个答案:

答案 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