GWT:何时使用LazyDomElement?

时间:2012-10-21 02:03:37

标签: java gwt dom widget

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

这是我的理解,当你真正想要创建自己的Widget子类(而不仅仅是扩展Composite)时,你需要为接口做各种额外的工作带有DOM的Widget。

所以我问:你必须做的“额外工作”是什么 - 你(基本上)从子类化Composite免费获得 - 以及如何使用LazyDomElement来实现这一目标更容易还是提升表现?

1 个答案:

答案 0 :(得分: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输入字段来保存我们的第一个加载时间。