6

我正在阅读 GWT 以准备我的第一个 GWT 应用程序,偶然发现了LazyDomElement并发现它很有趣。

我的理解是,当您真正想要创建自己的 Widget 子类(而不仅仅是简单地 extend Composite)时,您需要做各种额外的工作来将该 Widget 与 DOM 接口。

所以我问:你必须做的“额外工作”是什么——你(基本上)从子类化中免费获得Composite——以及你如何使用 aLazyDomElement来使这更容易或提高性能?

4

1 回答 1

3

从 GWT 文档和源代码来看,这个类似乎只是关于UIBinder功能,并且没有任何基本 GWT 小部件使用这个类。的主要和唯一功能LazyDomElement是延迟访问小部件的字段。假设您有一个带有模板的小部件:

<gwt:HTMLPanel>
  <div ui:field="lazyField" />
  <div ui:field="generalField" /> 
  <!-- Other fields -->
</gwt:HTMLPanel>

和它的Java类:

public class MyCoolWidget extends UIObject {
  interface MyUiBinder extends UiBinder<DivElement, MyCoolWidget> {}
  private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

  @UiField LazyDomElement<DivElement> lazyField;

  @UiField DivElement generalField;

  // all other fields …

  public MyCoolWidget() {
    // Initializes all your fields and also calls 'getElementById' for all
    // not lazy fields of your widgets to have a reference to them.
    // There could be hundreds of them if you are building really cool app, 
    // and also they could be hidden (e.g. other tab on UI) and not required 
    // to be accessed at all for some cases.
    setElement(uiBinder.createAndBindUi(this));
  }

  public void setLazyField(String value) { 
    // Finally we need to modify the field, ok, 
    // we access the DOM only at this moment
    // (please take a look at 'get()' method implementation for details)  
    lazyField.get().setInnerText(name); 
  }

  public void setGeneralField(String value) { 
    // Reference to element is already there, we are just going  
    // to change it's property
    generalField.setInnerText(name); 
  } 
}

因此,使用它的原因仅取决于您的应用程序的特定情况,您是否需要延迟加载小部件元素。

UPD。值得一提的是,我还没有在实际项目中使用过这个类:)。我可以想象一些场景。例如,您需要构建一个门票预订面板。具有以下初始要求:

  • 应支持最多 N 位旅客的机票预订
  • 每个旅行者的输入表单都相同且相当繁重(丰富的 html,很多输入字段)

因此,您需要一次渲染多达 10 个相同的丰富表单,而无需在页面加载之前访问它们的字段。我们可以构建ReservationForm小部件(ReservationForm.ui.xml带有标记和ReservationForm.java一些逻辑)并LazyDomElement用于输入字段以节省我们的第一次加载时间。

于 2012-10-28T18:36:36.953 回答