【问题标题】:GWT & GIN: how to inject PlaceController into a widget using UIBinderGWT & GIN:如何使用 UIBinder 将 PlaceController 注入到小部件中
【发布时间】:2011-06-12 00:22:43
【问题描述】:

我有一个在 UIBinder 中使用的 InlineLabel 子类。如何通过 GIN 将 PlaceController 注入其中,以便在 UIBinder 中使用小部件? (回想一下,UIBinder 需要一个无参数的构造函数。)

如果这不可能,那么让小部件可以使用 PlaceController 以便小部件在 onClick() 事件期间可以使用它的最简洁方法是什么?

编辑:

我不确定 MVP 是否真的是这种情况下的最佳解决方案(不过,我很高兴你改变主意。)

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

如果有办法将演示者注入到每个 InlineLabels 中也是可以接受的...然后委托可以执行如下操作:

   public class MyInlineLabelSubclass {
       // ...

       public void onClick(ClickEvent event)
       {
         presenter.labelClicked(this);
       }
    }

【问题讨论】:

  • 您不需要为每个 InlineLabel 提供明确的 @UiField,请参阅我修改后的答案。

标签: gwt dependency-injection uibinder gwt-gin


【解决方案1】:

您可以使用 @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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2012-07-11
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 2010-12-28
      相关资源
      最近更新 更多