我正在使用Wicket生成表单,以允许用户为多个模型对象设置值。每个模型对象都有两个字段operNam
和slaNam
。 operNam
值列表取自参数字符串operationNames
,我将这个以空格分隔的列表拆分,如下所示,并将每个列表放入名为myListResult
的ArrayList中。
String result = parameters.getString("operationNames");
//split list
ArrayList<String> myListResult = new ArrayList<String>(Arrays.asList(result.split(" ")));
for (String word : myListResult) {
System.out.println("===>" + word);
}
我想要做的是为用户创建一个表单,其中myListResult
中的每个条目都有两个元素。我添加的TextField
包含myListResult
中每个操作名称的值和空TextField
,以允许用户输入slaNam
的值。我目前用来执行此操作的代码如下:
for(String operation : myListResult) {
form.add(new TextField<String>("operNam" , new PropertyModel<String>(operation, "operNam")));
form.add(slaNam);
}
add(form);
我遇到的问题是上面的代码为TextField
中的每个项目添加了id
operNam
值为myListResult
的{{1}},这就是错误到期复制html中的id
个元素。我也试过这样做:
for(String operation : myListResult) {
form.add(new TextField<String>(operation , new PropertyModel<String>(operation, "operNam")));
form.add(slaNam);
}
add(form);
这可以避免重复id
元素的问题,但会导致问题,因为现在我的表单元素没有映射到我的模型对象,该对象需要一个名为operNam
的字段和另一个名为slaNam
的字段
我的问题是
如何在不使用重复元素id
名称的情况下创建表示任意数量模型的表单元素。
如果我在myListResult
中有4个项目,那么下图是我希望html看起来如何:
答案 0 :(得分:6)
您应该使用Repeater
添加TextField
。例如ListView
ListView listview = new ListView("listview", list) {
protected void populateItem(ListItem item) {
item.add(new TextField("textField", item.getModel()));
}
};
使用合适的HTML:
<span wicket:id="listview">
<input wicket:id="textField" type="text"></input><br/>
</span>
要在每行中使用多个字段,最简单的解决方案是使用包含以下字段的对象:
public class MyRow
{
public String slaNam;
public String operName;
}
并创建一个List
:
List<MyRow> myRows = new ArrayList<>();
并在ListView
ListView<MyRow> listview = new ListView("listview", myRows)
您可以在populateItem
protected void populateItem(ListItem<MyRow> item) {
item.add(new TextField("slaNam", new ProperyModel(item, "slaNam")));
item.add(new TextField("operName", new ProperyModel(item, "operNam")));
}
或者,使用ProperyListView
代码更少:)