2012-10-21 19 views
6

İlk GWT uygulamasının hazırlanmasında GWT'yi okuyorum ve LazyDomElement'u tökezledim ve ilginizi çekiyor.GWT: LazyDomElement ne zaman kullanılmalıdır?

Bu anlamak benim olduğunu gerçekten kendi Widget alt sınıfı (ve sadece basitçe Composite uzatmaz) oluşturmak istediğinizde, DOM ile bu Widget arabirim için ek iş her türlü yapmak gerektiğini. Bu kolaylaştırmak veya performansını artırmak için ve nasıl bir LazyDomElement kullanabilirsiniz - Eğer (aslında) almak ücretsiz Composite sınıflara gelen - yapmanız gereken "ekstra iş" nedir:

yüzden sormak? GWT dokümantasyon ve kaynak kodu itibaren

cevap

3

sınıf yalnızca yaklaşık UiBinder işlevselliği gibi görünüyor ve baz GWT widget hiçbiri bu sınıfını kullanın. LazyDomElement'un ana ve tek özelliği, widget'ınızın alanlarına ertelenmiş erişimdir.

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

ve Java sınıfı bunun için: Diyelim ki şablonla bir widget var diyelim,

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

Yani, bunu kullanarak nedeni sadece uygulamanızın özel durumda bağlıdır ihtiyacın var? widget öğelerin tembel yükleme veya değil.

UPD. Henüz bu projeyi henüz gerçek projelerde kullanmadığımı belirtmeliyim :). Bazı senaryoları hayal edebiliyorum. Örneğin bir bilet rezervasyon paneli oluşturmanız gerekir. yukarı N yolcular için her gezgin için

  • Girdi formlarını biletler rezervasyon desteklemeli
    • (zengin html, giriş alanlarının bir çok)

    eşit ve oldukça ağır şunlardır: a aşağıdaki başlangıç ​​şartlarına sahip Dolayısıyla, sayfa yüklenmeden önce alanlarına erişmek zorunda kalmadan, bir kerede en fazla 10 eşit zengin form oluşturmalısınız. ReservationForm widget'ını (ReservationForm.ui.xml işaretli ve ReservationForm.java bazı lojik için) oluşturabilir ve ilk yükleme süremizi kaydetmek için giriş alanları için LazyDomElement kullanabilirsiniz.

  • +0

    Wow - harika cevap, teşekkürler @mudalov (+1)! Ödül için hızlı bir takip: Birinin, widget öğelerinin tembel yüklenmesine ihtiyaç duyacağı birkaç durum senaryoyu içerecek şekilde lütfen cevabınızı güncelleyebilir misiniz? GWT için yeni bir markayım ve burada "ağaçları ağaçlardan görmek" için zor bir zaman geçiriyorum. Tekrar teşekkürler! – IAmYourFaja

    +0

    @ 4herpsand7derpsago, Basit bir durum ekledim. – udalmik

    İlgili konular