2013-04-17 14 views
11

Próbuję zadeklarować te elementy w moim UiBinder XML:Dodaj ID do pola z ui: deklaracji pola

<label for="lastName">Last Name:</label> 
<input type="text" id="lastName" ui:field="lastNameField" maxlength="150" /> 

Mówiąc najprościej, etykiety, który jest skojarzony z wprowadzania tekstu.

Kiedy próbuję skompilować, jednak otrzymuję ten błąd:

[ERROR] Cannot declare id="lastName" and ui:field="lastNameField" on the same element Element (:23)

To wydaje się idiotyczny ograniczeń, zwłaszcza od ui:field nie generuje identyfikator. Jedynym rozwiązaniem znalazłem tak daleko jest przypisanie identyfikatora w kodzie Java sama jak ta:

@UiElement InputElement lastNameField; 
... 
lastNameField.setId("lastName"); 

To dodaje niepotrzebnego bałaganu do mojego Java. Dodaje także komplikacji, że jeśli identyfikator zostanie zaktualizowany gdzieś w dół, deklaracja <label> w XML również będzie musiała zostać zaktualizowana (i nie ma @UiElement dla etykiety, więc jest prawie całkowicie niewidoczny ze strony Java).

Czy istnieje sposób na dodanie identyfikatora do elementu z deklaracją pola ui: z samego pliku UiBinder XML?

Odpowiedz

11

UiBinder używa identyfikatora do realizacji swojej magii ui:field, więc nie można go ustawić z XML.

Sposobem na to jest mieć stały Java z ID i używać go z obu stron:

@UiField(provided = true) 
final String lastNameId = Document.get().createUniqueId(); 

@UiField InputElement lastNameField; 

… 

lastNameField.setId(LAST_NAME_ID); 

oraz w XML:

<ui:with field="lastNameId" type="java.lang.String"/> 

… 

<label for="{lastNameId}">Last Name:</label> 
<input ui:field="lastNameField" maxlength="150"/> 

pamiętać, że Haven testowałem powyższy kod z type="java.lang.String", zawsze używałem zamiast klasy zawierającej różne identyfikatory (lub raczej interfejs z generatorem)

Alternatywy to:

  • jeśli można użyć składni alternatywną dla <label>:

    <label>Last Name: <input ui:field="lastNameField" maxlength="150"/></label> 
    
  • odczytać wartość for="" z Java do używania go w setId(), w ten sposób przynajmniej usunąć duplikacja, ale nadal będziesz mieć problem z tym, że Twoje identyfikatory prawdopodobnie nie będą unikalne (jak tylko użyjesz widżetu UiBinder więcej niż raz)

    <label ui:field="lastNameLabel" for="lastName">Last Name:</label> 
    <input ui:field="lastNameField" maxlength="150" /> 
    
    @UiField LabelElement lastNameLabel; 
    @UiField InputElement lastNameField; 
    
    … 
    
    lastNameField.setIf(lastNameLabel.getHtmlFor()); 
    
+1

Co z debugId? http://stackoverflow.com/questions/11845544/how-can-i-set-id-for-gwt-widgets-in-uibinder – Jonathan

+2

Identyfikatory debugowania są dostępne dla ... debugowania. Nadużywanie narzędzi rzadko przynosi dobre efekty w dłuższej perspektywie. –

4

można uprościć odpowiedź Thomasa (trochę), korzystając z identyfikatora w UiBinder tak:

<b:ControlLabel for="{testTextBox.getId}">TextBox</b:ControlLabel> 
<b:TextBox ui:field="testTextBox"></b:TextBox> 

// In code behind: 
@UiField(provided = true) 
TextBox testTextBox = new TextBox(); 
... 
testTextBox.setId("test"); 
this.initWidget(uiBinder.createAndBindUi(this)); 

Jeśli używasz GWT Bootstrap jest przydatna funkcja, która pozwala ci drut aż wszystko tylko XML:

<b:ControlLabel for="{testTextBox.getId}">TextBox</b:ControlLabel> 
<b:TextBox ui:field="testTextBox" b:id="test"></b:TextBox> 
+0

Wielkie dzięki za dział o gwt-bootstrap, było to dla mnie niezwykle przydatne! – annouk

0

b:id="test" działa dla wszystkich gwtbootstrap3 widgetów.

+0

Niestety, pytanie dotyczy wanny GWT, a nie jakiegoś wariantu bootstrap. –

+0

To przydatne informacje. Bootstrap jest bardzo popularny. –

+0

Jest już zawarty w powyższej odpowiedzi Roba. –

Powiązane problemy