The specific case I’ve got in mind is as follows: an AjaxFormComponentUpdatingBehavior(“onchange”) is added to a TextField in a form. The behavior verifies the text for certain conditions (either the model object or the form component model, doesn’t matter), based on which it might display a message (or hide it, if it has already been shown).
The problem is, there are also validators added to the TextField. One of the possible (and likely) scenarios consists of the user typing in, first, a value that causes the message to be displayed by the AJAX request. If, then, he/she types in a value that doesn’t pass validation, the message should disappear, but it does not.
Apparently, either the onUpdate() method for the AJAX behavior is not called at all, or I am failing in my attempts to insert a check for non-validated entries (I have tried to test for both null values and empty strings, to no avail; I have no idea what exactly Wicket’s validators do to models when data is invalid).
I am wondering if someone who actually understands validators (or AJAX, actually) has any ideas on where the problem could be.
I can post edit and post code if someone tells me this is not a general issue tying validators and AJAX, but most likely a programming mistake. I still believe the former and thus I’ll refrain from posting code sections, in order to keep the discussion on an API/theoretical frame.
Thanks.
When using an
AjaxFormComponentUpdatingBehavior, if any of theIValidators fail their validation,onError()will be called instead ofonUpdate(). Wicket will effectively prevent invalid user input from reaching theIModels in your components, so the component’s ModelObject will not be changed at all. The invalid input will probably remain available by means ofgetInput()/getConvertedInput()(not sure if it will in an AJAX scenario, it sure is in a traditional form submission).However, take into account that
IFormValidators are not executed when using this mechanism. If you’ve got any, you might be interested in overridinggetUpdateModel()so thatAjaxFormComponentUpdatingBehaviorwill not bring maybe-invalid user input into yourIModels, and set modelobjects manually when you’re certain user input is valid.Regarding your specific case, you could perform all the required logic in
onError()(or rely onModels that will grab data from somewhere else), and just add the components that need refreshing to theAjaxRequestTarget. This is probably what’s missing in your scenario.