我想在我的UiBinder XML中声明这些元素:
<label for="lastName">Last Name:</label>
<input type="text" id="lastName" ui:field="lastNameField" maxlength="150" />
简单地说,就是与文本输入相关联的标签。
当我尝试编译时,然而,我得到这个错误:
[ERROR]不能在同一个元素上声明id="lastName"和ui:field="lastNameField"
这似乎是一个愚蠢的限制,特别是因为ui:field
不生成ID。到目前为止,我找到的唯一解决方案是在Java代码中分配ID,如下所示:
@UiElement InputElement lastNameField;
...
lastNameField.setId("lastName");
这给我的Java增加了不必要的混乱。它还增加了复杂性,如果这个ID在某个地方更新了,XML中的<label>
声明也需要更新(并且标签没有@UiElement,因此从Java端几乎完全不可见)。
是否有一种方法来添加一个ID到一个元素与ui:字段声明从UiBinder XML本身?
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>
从Java中读取
for=""
值以在setId()
中使用它,这样至少可以删除重复,但您仍然会遇到您的id可能不会是唯一的问题(一旦您使用您的UiBinder-widget不止一次)<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());
你可以通过像这样访问ibinder中的id来简化Thomas的回答(一点):
<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));
如果您使用GWT Bootstrap,那么有一个方便的特性可以让您仅以xml格式连接所有内容:
<b:ControlLabel for="{testTextBox.getId}">TextBox</b:ControlLabel>
<b:TextBox ui:field="testTextBox" b:id="test"></b:TextBox>
b:id="test"
适用于所有gwtbootstrap3控件