Hi all,
I'm having a weird problem that causes an input to refuse to update with an
AjaxLink click method when there's been a validation error. One field in the
form has a property model pointing to an Integer value. It's set to
required, and there are other links that set the Integer value.
What I see is that when I first click a link that populates the Integer
under the required field, everything works fine. But when I click submit
first, the populate links stop working. The handlers are still invoked, but
the HTML that comes back in the Ajax Debug shows an input with value=""
(even though the getModelObject() for that TextField returns the proper
value in debugging statements). This results in the input always being
showed empty. If I do things in the proper order, I see the correct value
populate in the text field as expected. It's not just a display issue,
either. The form refuses to submit successfully at all if there was a
validation error first (and you don't manually enter anything into the
field).
Below is a simple application that reproduces the issue I'm seeing. I'm
using wicket 1.3.7 but I've tried 1.4.1 with the same result. Any help would
be greatly appreciated.
Thanks
Neil
public class HomePage extends WebPage {
public HomePage() {
add(new TestForm("testForm"));
}
class TestForm extends Form {
private Integer value;
private FeedbackPanel feedbackPanel;
private TextField testInput;
public TestForm(String id) {
super(id);
add(feedbackPanel = new FeedbackPanel("feedbackPanel"));
feedbackPanel.setOutputMarkupId(true);
add(testInput = new TextField("testInput", new
PropertyModel(this, "value")));
testInput.setRequired(true);
testInput.setOutputMarkupId(true);
add(new AjaxButton("submitButton"){
@Override
protected void onError(AjaxRequestTarget target, Form form)
{
target.addComponent(feedbackPanel);
}
protected void onSubmit(AjaxRequestTarget target, Form form)
{
info("It worked!");
target.addComponent(feedbackPanel);
}
});
add(new AjaxLink("chooseOneLink"){
public void onClick(AjaxRequestTarget target) {
value = 1;
target.addComponent(testInput);
target.addComponent(feedbackPanel);
}
});
}
}
}
<html>
<body>
<form wicket:id="testForm">
<div wicket:id="feedbackPanel"/>
<input wicket:id="testInput"/>
<a wicket:id="chooseOneLink">Choose 1</a>
<button wicket:id="submitButton">Submit</button>
</form>
</body>
</html>