2012-10-21 18 views
6

Ich lese GWT in Vorbereitung meiner ersten GWT-App und stolperte über die LazyDomElement und finde es faszinierend.GWT: Wann LazyDomElement zu verwenden?

Es ist mein Verständnis, dass, wenn Sie wirklich wollen, Ihre eigene Widget Unterklasse (und nicht nur einfach erweitern Composite) erstellen, dass Sie das Widget für die Anbindung mit dem DOM allerlei zusätzlichen Arbeit tun müssen.

Also frage ich: Was ist die "Extra Arbeit", die Sie tun müssen - dass Sie (im Wesentlichen) kostenlos von Subklassen Composite bekommen - und wie können Sie eine LazyDomElement verwenden, um dies zu erleichtern oder Leistung zu steigern?

Antwort

3

Aus GWT Dokumentation und Quellcode scheint es, dass diese Klasse nur über UIBinder Funktionalität und keiner der Basis GWT Widgets diese Klasse verwenden. Die Hauptfunktion und einzige Funktion von LazyDomElement ist der verzögerte Zugriff auf die Felder Ihres Widgets. Angenommen, Sie haben ein Widget mit Vorlage haben:

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

und Java-Klasse für sie:

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); 
    } 
} 

Also, der Grund ist es der Verwendung hängt nur von Fall Ihrer Anwendung, benötigen Sie Lazy Loading Ihrer Widget-Elemente oder nicht.

UPD. Es ist erwähnenswert, dass ich diese Klasse noch nicht in realen Projekten verwendet habe :). Ich kann mir ein Szenario vorstellen. Zum Beispiel müssen Sie ein Reservierungsfenster für Tickets erstellen. Mit folgenden Anfangsbedingungen:

  • Sollte Ticketreservierung für bis zu N-Reisende
  • Eingabeformulare für jeden Reisenden sind gleich und ziemlich schwer (Rich-HTML, viele Eingabefelder) unterstützen

Daher müssen Sie bis zu 10 gleichwertige Rich-Forms gleichzeitig rendern, ohne dass Sie auf ihre Felder zugreifen müssen, bevor die Seite geladen wird. Wir könnten ReservationForm Widget (ReservationForm.ui.xml mit Markup, und ReservationForm.java für einige Logik) bauen und LazyDomElement für Eingabefelder verwenden, um unsere erste Ladezeit zu speichern.

+0

Wow - große Antwort, danke @mudalov (+1)! Eine schnelle Folge für das Kopfgeld: Könntest du bitte deine Antwort aktualisieren, um ein paar Anwendungsszenarien aufzunehmen, in denen jemand ein langsames Laden von Widget-Elementen benötigt? Ich bin ganz neu bei GWT und habe eine schwere Zeit, "den Wald durch die Bäume zu sehen". Danke noch einmal! – IAmYourFaja

+0

@ 4herpsand7derpsago, ich habe einen einfachen Fall hinzugefügt. – udalmik

Verwandte Themen