1

我正在尝试生成一个带有变量的表单 - 在服务器端 - 文本字段的数量。挂毯页面类似于:

<form t:id="form">
    <t:loop source="typesOfIncome" value="typeOfIncome">
        <input t:type="TextField" t:id="typeOfIncome-${typeOfIncome.propertyIndex}" value="100"/>
    </t:loop>
</form>

Tapestry 不接受这一点,因为它使用

组件 ID 'typeOfIncome-${typeOfIncome.propertyIndex}' 无效;组件 ID 必须是有效的 Java 标识符:以字母开头,由字母、数字和下划线组成。

我怎样才能用 Tapestry 做到这一点?Java 代码在组件中的外观如何?


更新

使用如下所示的组件:

public class FormSample {

    @Component
    private Form _form;

    @Inject
    private Logger _log;

    @Property
    private List<String> _typesOfIncome;

    @Property
    private String _typeOfIncome;

    @SetupRender
    void setupRender() {
        _typesOfIncome = Arrays.asList("First", "Second");
    }

    void onSuccess() {
        _log.info("Got values " + _typesOfIncome + " .");
    }

}

和一个页面包含

<form t:id="form">
  <t:loop source="typesOfIncome" value="typeOfIncome">
    <input t:type="TextField" t:id="typeOfIncome" t:value="typeOfIncome"/> <br/>
  </t:loop>
  <input type="submit" value="Save"/>
</form>

onSuccess值列表中为空。这些值发布为:

typeOfIncome    First
typeOfIncome_0  Second
4

1 回答 1

2

我做了一些测试并更新了这个。您可以使用纯列表来完成此操作,但我只能使用一个类来保存收入类型。

在 Java 中:

@Property
@Persist
private List<Info> _infoList;

@Property
private Info _info;

void onPrepare() {
  // populate _typesOfIncome with existing ones
  if (_infoList == null) {
    _infoList = new ArrayList<Info>();
    _infoList.add(new Info("type1"));
    _infoList.add(new Info("type2"));
  }
}

void onSuccess() {
  for (Info i : _infoList) {
    System.out.println(i.getTypeOfIncome());
  }
}

public class Info {
  private String typeOfIncome;  
  public Info() { }
  public Info(String typeOfIncome) {
    this.typeOfIncome = typeOfIncome;
  }
  public String getTypeOfIncome() {
    return typeOfIncome;
  }
  public void setTypeOfIncome(String typeOfIncome) {
    this.typeOfIncome = typeOfIncome;
  }
}

在模板中:

<t:form t:id="form">
  <t:loop t:source="infoList" t:value="info" formState="ITERATION">
    <input t:type="TextField" t:id="typeOfIncome" t:value="info.typeOfIncome"/><br/>
  </t:loop>
  <input t:type="submit" name="Submit"/>
</t:form>

如果您希望能够即时添加新类型,这里有一个很好的示例

于 2010-09-16T18:26:24.740 回答