2010-03-18 15 views
5

bu benim ilk gönderiim. Umarım birisi bana yardım edebilir.
UiBinder XML düzen dosyasında bir widget'i, düzen hiyerarşisinin bir parçası olmadan, ayrı ayrı tanımlamanın bir yolunu arıyorum. İşte küçük bir örnek:GWT - Ubinder xml dosyasındaki bir Düzenleme düzeni hiyerarşisi nasıl tanımlanır

<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder" 
xmlns:g="urn:import:com.google.gwt.user.client.ui"> 

<g:Label ui:field="testlabel" text="Hallo" /> 
<g:HTMLPanel>  
... 
</g:HTMLPanel> 

derleme ui beri başarısız: UiBinder elemanı yalnızca bir alt öğesi bekliyor.
Java Code i erişebilir ve her zamanki gibi Etiket widget'ı bağlayacaktır: Bir Izgara veya FlexTable tanımladığınızda

@UiField Label testlabel; 

Örneğin, bu yararlı olabilir - i içinde tablo başlığındaki için Etiketler tanımlamak istediğiniz XML düzeni dosyası, kod içinde programsal olarak değil.

+1

Neyi başarmaya çalışıyorsunuz? Örneğin, sadece testLabel'ın görünmemesini istiyorsanız, CSS kural ayarının "display: none" olduğu bir styleName atayabilirsiniz. – aem

cevap

2

Maalesef önceden

Çok teşekkürler, hiçbir yapabilirsiniz UiBinder sadece sözdizimi bu tür desteklemez. Bir düşünün - bu Widget nereye giderdi? DOM ağacına eklenmeli mi? Ayrıca, bu kodun kullanılmamış olarak budanması gerekip gerekmediğini derleyici için zorlaştırır.

GWT ekibinin Grid için (örneğin, DockLayoutPanel gibi) özel etiketler oluşturmasını beklemek zorundasınız. FlexTable için bu tür bir işlevsellik beklemiyordum, çünkü dinamik içerik için tasarımın anlamı, programsal olarak eklenmesi anlamına geliyordu.

0

UIBinder şablonlarınızı temiz bir şekilde nasıl yapılandıracağınızı öğrenmek için UiBinder Dev Guide'u anlamak anahtardır.

Yani, tek yapmanız gereken bir pencere öğesi oluşturmak ve başlangıçta DOM'da bulundurmamaksa, bunu UiBinder şablonunda hiç belirtmeyin. Bunun yerine, UiBinder şablonunuzla birlikte gelen Java dosyasında, onu oluşturun ve şablonunuzda tanımlanan bir panele ekleyin.

<g:HTMLPanel ui:field='container'>  
... 

Ve Java dosyasında bu koyun:

Örneğin, şablonda bu koymak seni ve daha yerleştirmek için aynı olağandışı motivasyon varsa belirli değilim

@UiField HTMLPanel container; 
public MyWidget() { 
    initWidget(uiBinder.createAndBindUi(this)); 
    Label testLabel = new Label("hallo"); 
    // Do whatever you want to testLabel 
    container.add(testLabel); 
} 
0

uibinder etiketinin altındaki iki kök widget'tan daha fazlası. Her neyse, böyle yaparım.

Uibinder etiketi yalnızca bir kök parçacığına izin verdiğinden, bir HTML ui etiketini kök pencere öğesi olarak yerleştiririm ve ardından bu sözdizimi içinde birden çok sözde kök widget'ım yığılır.

Aşağıdaki örnekte, gerçek kök parçacığının ui: alan adı olmadığına dikkat edin, çünkü kullanmak niyetinde değiliz. Bizim bildiğimiz kadarıyla, etkili kök widget'ları "tabLayout" ve "content" dir.

Dosya Hello.ui.xml:

<ui:UiBinder 
    xmlns:ui="urn:ui:com.google.gwt.uibinder" 
    xmlns:g="urn:import:com.google.gwt.user.client.ui"> 
    <g:HTML> 
    <g:TabLayoutPanel ui:field="tabLayout" ... > 
     blah ... blah 
    </g:TabLayoutPanel> 
    <g:VerticalPanel ui:field="content"> 
     blah .. blah 
    </g:VerticalPanel> 
    </g:HTML> 
</ui:UiBinder> 

şablonun arkasında java kodu olarak kompozit uzatmayın. Modül giriş noktası tarafından içe aktarılan bir sınıfı oluşturun veya şablonu doğrudan modülünüzde kullanın.

Birden fazla kök parçacığına ihtiyacım olan çeşitli nedenlerim var.Bu örnekte, belirli şartlarda "etkili kök widget'ı" takmak:

public class Hello 
    implements EntryPoint{ 

    private static HelloUiBinder uiBinder = GWT.create(HelloUiBinder.class); 

    interface HelloUiBinder 
    extends UiBinder<Widget, Hello>{} 

    @UiField TabLayoutPanel tabLayout; 
    @UiField VerticalPanel content; 

    @Override public void onModuleLoad() { 
    uiBinder.createAndBindUi(this); 

    if (condition1) 
     RootPanel.get().add(tabLayout); 
    else 
     RootPanel.get().add(content); 

    blah ... blah 
    } 
} 

Yani, hüner hiç gerçek kök widget'ı kullanmak değildir.

+0

-1 - Çünkü bu "iç" widget'lardan birini kullanmak istediğinizde, diğerlerini de yaratmalısınız -> hafıza kaybı. mr_room sadece XML/HTML/UiBinder'ın bu şekilde kullanılmasının gerekmediğini anlamalıdır. Daha sonra eklemek istediğiniz bazı öğeleriniz varsa, bunu programlı olarak yapın (jQuery ve benzeri kitaplıklar konusuna bakın - HTML dosyasında bir sonraki HTML etiketlerini "yerleştirmeyin, programlı olarak eklemelisiniz) veya ayıklayın. ayrı bir Widget/UiBinder şablonuna. –

+0

Bir div etiketi ne kadar pahalı? –

+0

* sadece * bir div etiketi değil - widget'lara bağlı olarak, birçok olay işleyicileri, karmaşık şemalar, vb. Olabilir. Sadece bir kısmı kullanmak için bunları oluşturmanız gerekir - IMHO, bu bir israf. –

İlgili konular