Add id to field with ui:field declaration

前端 未结 3 1262
面向向阳花
面向向阳花 2021-02-05 18:00

I\'m trying to declare these elements in my UiBinder XML:




        
相关标签:
3条回答
  • 2021-02-05 18:37

    You may simplify Thomas' answer (a bit) by accessing the id in uibinder like this:

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

    If you use GWT Bootstrap there is a handy feature that let's you wire up everything in xml only:

    <b:ControlLabel for="{testTextBox.getId}">TextBox</b:ControlLabel>
    <b:TextBox ui:field="testTextBox" b:id="test"></b:TextBox>
    
    0 讨论(0)
  • 2021-02-05 18:47

    b:id="test" works for all gwtbootstrap3 widgets.

    0 讨论(0)
  • 2021-02-05 18:51

    UiBinder uses the ID to implement its ui:field magic, so no you can't set it from the XML.

    The way to do it is to have a Java constant with the ID and use it from both sides:

    @UiField(provided = true)
    final String lastNameId = Document.get().createUniqueId();
    
    @UiField InputElement lastNameField;
    
    …
    
    lastNameField.setId(LAST_NAME_ID);
    

    and in the XML:

    <ui:with field="lastNameId" type="java.lang.String"/>
    
    …
    
    <label for="{lastNameId}">Last Name:</label>
    <input ui:field="lastNameField" maxlength="150"/>
    

    Note that I haven't tested the above code with type="java.lang.String", I've always used a class containing various identifiers instead (or rather, an interface with a generator)

    Alternatives are:

    • if you can, use the alternate syntax for <label>:

      <label>Last Name: <input ui:field="lastNameField" maxlength="150"/></label>
      
    • read the for="" value from Java to use it in setId(), that way at least you remove duplication, but you'll still have the issue that your IDs possibly won't be unique (as soon as you use your UiBinder-widget more than once)

      <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());
      
    0 讨论(0)
提交回复
热议问题