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