我正在尝试实现一个AJAXfied Wicket列表视图。在我的研究中,我偶然发现this site上的代码并对其进行了一些修改。
模型未正确更新。因此,只要在文本字段中输入值,就会忘记调用AJAX提交链接(文本字段为空)。为什么会这样?我没有看到此代码有任何问题。 Wicket版本是1.5.2。
这是Java代码:
// Initialization of form
...
// List all rows
ArrayList<String> rows = new ArrayList<String>(2);
rows.add(new String());
rows.add(new String());
final ListView<String> lv = new ListView<String>("rows", rows) {
@Override
protected void populateItem(ListItem<String> item) {
int index = item.getIndex() + 1;
item.add(new Label("index", index + "."));
TextField<String> text = new TextField<String>("text", item.getModel());
item.add(text);
}
};
rowPanel.add(lv);
AjaxSubmitLink addLink = new AjaxSubmitLink("addRow", form) {
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
if (target != null) target.add(rowPanel);
}
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
lv.getModelObject().add(new String());
if (target != null) target.add(rowPanel);
}
};
addLink.setDefaultFormProcessing(false);
rowPanel.add(addLink);
...
这是标记:
<div wicket:id="rowPanel">
<span wicket:id="rows">
<span wicket:id="index">1.</span>
<input type="text" wicket:id="text"/>
</span>
<a href="#" wicket:id="addRow">Add row</a>
</div>
答案 0 :(得分:3)
答案 1 :(得分:1)
如果您没有添加以下行,您的示例将正常工作:
addLink.setDefaultFormProcessing(false);
您的链接不会像通常那样处理表单(更新模型等,请参阅IFormSubmitter)
您可以使用嵌套表单仅更新所需区域,并将defaultFormProcessing设置为true。
像:
<form wicket:id="form">
(...) <!-- (other form elements you dont want to get updated -->
<form wicket:id="repeaterForm"> <!-- form for your repeater textfields-->
<div wicket:id="refreshDiv">
<input type="textfield" wicket:id="repeaterText" />
</div>
<a wicket:id="addMoreLink>add more</a>
</form>
</form>
Wicket将确保您的标记中实际上没有嵌套表单(它将用div替换嵌套表单),因为它不是有效的HTML。但它可以像表格嵌套一样工作。
答案 2 :(得分:1)
您必须使用目标中的模型:
IModel model = target.getModel();
然后转换为listView。我不知道这是否有效,但我在这里有一些类似的代码。