12

UiBinder XML でこれらの要素を宣言しようとしています。

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

簡単に言えば、テキスト入力に関連付けられたラベルです。

ただし、コンパイルしようとすると、次のエラーが発生します。

[エラー] 同じ要素で id="lastName" と ui:field="lastNameField" を宣言できません Element (:23)

ui:field特にID を生成しないため、これはばかげた制限のように思えます。これまでに見つけた唯一の解決策は、次のように Java コード自体に ID を割り当てることです。

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

これにより、Java が不必要に煩雑になります。また、この ID がどこかで更新された場合<label>、XML の宣言も更新する必要があるという複雑さを追加します (ラベルに @UiElement がないため、Java 側からはほとんど完全に見えません)。

UiBinder XML 自体から ui:field 宣言を使用して要素に ID を追加する方法はありますか?

4

3 に答える 3

12

UiBinder は ID を使用してそのui:field魔法を実装するため、XML から設定することはできません。

それを行う方法は、ID を持つ Java 定数を持ち、それを両側から使用することです。

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

@UiField InputElement lastNameField;

…

lastNameField.setId(LAST_NAME_ID);

XML では次のようになります。

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

…

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

上記のコードを でテストしていないことに注意してくださいtype="java.lang.String"。代わりに、さまざまな識別子を含むクラスを常に使用してきました (または、ジェネレーターとのインターフェイス)。

代替手段は次のとおりです。

  • 可能であれば、次の代替構文を使用してください<label>

    <label>Last Name: <input ui:field="lastNameField" maxlength="150"/></label>
    
  • for=""Java から値を読み取ってで使用しsetId()ます。そのようにして、少なくとも重複を削除しますが、ID が一意にならない可能性があるという問題が残ります (UiBinder ウィジェットを複数回使用するとすぐに)。

    <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());
    
于 2013-04-17T22:39:39.613 に答える
0

b:id="test"すべてのgwtbootstrap3ウィジェットで機能します。

于 2015-02-06T20:35:02.850 に答える