我正在尝试编写一个检票口客户端,这是有状态的。这让我有些头疼,因为我有一个表格显示一些表格数据。用户必须能够在数据中添加/删除行,而不会在每次添加/删除行时向服务器发起 Ajax 请求。我已经通过使用完美的 jQuery 在浏览器中实现了添加行功能。问题是我如何让它与 Wicket 一起工作?
我的html片段:
<table class="table">
<thead>
...
</thead>
<tbody>
<tr wicket:id="voyagePlan">
<td><input wicket:id="berth.name" type="text"/></td>
<td><input wicket:id="berth.position.lattitude" type="text"/></td>
<td><input wicket:id="berth.position.longitude" type="text" /></td>
<td><input wicket:id="arrival" type="text"/></td>
<td><input wicket:id="departure" type="text"/></td>
<td><button type="submit" class="btn btn-danger">Delete</button></td>
</tr>
</tbody>
</table>
我的Java代码:
private CompoundPropertyModel<List<Voyage>> model = new CompoundPropertyModel<>(new VoyageModel());
public MyForm(String id) {
super(id, "MyForm");
WebMarkupContainer modalBody = new WebMarkupContainer("modalBody", model);
add(modalBody);
final PropertyListView<Voyage> lv = new PropertyListView<Voyage>("voyagePlan") {
@Override
protected void populateItem(ListItem<Voyage> item) {
item.add(new TextField<String>("key"));
item.add(new TextField<String>("berth.name"));
item.add(new TextField<String>("berth.position.lattitude"));
item.add(new TextField<String>("berth.position.longitude"));
item.add(new TextField<String>("arrival"));
item.add(new TextField<String>("departure"));
}
};
modalBody.add(lv);
saveLink = new AjaxSubmitLink("save") {
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
shipService.saveVoyageInformation(model.getObject());
target.add(this.getParent());
}
};
add(saveLink);
}
public class VoyageModel extends LoadableDetachableModel<List<Voyage>> {
@Override
protected List<Voyage> load() {
return myService.getVoyage(mmsi);
}
}
有了这段代码,问题就变成了,当新行被添加和提交时如何更新 List 实例?目前仅更新对现有行的更改。新行永远不会保存到数据库中。
我已经考虑按照此处描述的方法编写将数据发送为 json 的功能:http: //thewicketevangelist.blogspot.dk/2011/12/marrying-wicket-and-jquery-ajax.html。如果我理解正确,这将意味着 TextField.setRequired 等表单输入字段验证不再可用。这理解正确吗?
我想要一种接近正常 Wicket Web 请求处理的方法,具有输入验证等的所有好处。