【问题标题】:Add id to field with ui:field declaration使用 ui:field 声明将 id 添加到字段
【发布时间】:2013-04-10 20:40:01
【问题描述】:

我正在尝试在我的 UiBinder XML 中声明这些元素:

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

简单地说,与文本输入相关联的标签。

然而,当我尝试编译时,我得到了这个错误:

[错误] 不能在同一个元素 Element (:23) 上声明 id="lastName" 和 ui:field="lastNameField"

这似乎是一个愚蠢的限制,特别是因为ui:field 不会生成 ID。到目前为止,我发现的唯一解决方案是在 Java 代码本身中分配 ID,如下所示:

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

这给我的 Java 添加了不必要的混乱。它还增加了一个复杂性,如果此 ID 在某处更新,则 XML 中的 &lt;label&gt; 声明也需要更新(并且标签没有 @UiElement,因此从 Java 端几乎完全不可见.)

有没有办法通过 UiBinder XML 本身的 ui:field 声明向元素添加 ID?

【问题讨论】:

    标签: gwt uibinder


    【解决方案1】:

    b:id="test" 适用于所有 gwtbootstrap3 小部件。

    【讨论】:

    • 不幸的是,问题是关于香草 GWT,而不是一些引导程序变体。
    • 这是有用的信息。 Bootstrap 非常流行。
    • gwtbootstrapgwtbootstrap3 是两个不同的库。在这种情况下,它们共享相同的功能,但情况并非总是如此。我的帖子是关于 gwtbootstrap3,而他提到了 gwtbootstrap。
    【解决方案2】:

    您可以通过像这样访问 uibinder 中的 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>
    

    【讨论】:

    • 非常感谢有关 gwt-bootstrap 的部分,它对我非常有用!
    【解决方案3】:

    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"测试过,我一直用 一个包含各种标识符的类(或者更确切地说,一个带有生成器的接口)

    替代方案是:

    • 如果可以,请使用 &lt;label&gt; 的替代语法:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 2022-10-03
    • 2011-04-15
    • 1970-01-01
    • 2016-07-17
    • 2019-04-25
    相关资源
    最近更新 更多