我正在阅读 GWT 以准备我的第一个 GWT 应用程序,偶然发现了LazyDomElement并发现它很有趣。
我的理解是,当您真正想要创建自己的 Widget 子类(而不仅仅是简单地 extend Composite
)时,您需要做各种额外的工作来将该 Widget 与 DOM 接口。
所以我问:你必须做的“额外工作”是什么——你(基本上)从子类化中免费获得Composite
——以及你如何使用 aLazyDomElement
来使这更容易或提高性能?
我正在阅读 GWT 以准备我的第一个 GWT 应用程序,偶然发现了LazyDomElement并发现它很有趣。
我的理解是,当您真正想要创建自己的 Widget 子类(而不仅仅是简单地 extend Composite
)时,您需要做各种额外的工作来将该 Widget 与 DOM 接口。
所以我问:你必须做的“额外工作”是什么——你(基本上)从子类化中免费获得Composite
——以及你如何使用 aLazyDomElement
来使这更容易或提高性能?
从 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。值得一提的是,我还没有在实际项目中使用过这个类:)。我可以想象一些场景。例如,您需要构建一个门票预订面板。具有以下初始要求:
因此,您需要一次渲染多达 10 个相同的丰富表单,而无需在页面加载之前访问它们的字段。我们可以构建ReservationForm
小部件(ReservationForm.ui.xml
带有标记和ReservationForm.java
一些逻辑)并LazyDomElement
用于输入字段以节省我们的第一次加载时间。