Hi!
I don't see the problem, setDefaultModelObject also clears input via
internalOnModelChanged:
public final Component setDefaultModelObject(final Object object)
{
final IModel<Object> model = (IModel<Object>)getDefaultModel();
// Check whether anything can be set at all
if (model == null)
{
throw new IllegalStateException(
"Attempt to set model object on null model of
component: " +
getPageRelativePath());
}
// Check authorization
if (!isActionAuthorized(ENABLE))
{
throw new UnauthorizedActionException(this, ENABLE);
}
// Check whether this will result in an actual change
if (!getModelComparator().compare(this, object))
{
modelChanging();
model.setObject(object);
modelChanged();
}
return this;
}
public final void modelChanged()
{
// Call user code
internalOnModelChanged();
onModelChanged();
}
protected void internalOnModelChanged()
{
// If the model for this form component changed, we should make
it
// valid again because there can't be any invalid input for it
anymore.
valid();
}
public final void valid()
{
clearInput();
onValid();
}
**
Martin
2010/2/23 Pedro Santos <[email protected]>:
> Hi Martin, call get or set defaultModel is not the solution, consider this
> another test case:
>
> The new link implementation:
>
> AjaxLink link = new AjaxLink("reload")
> {
> �...@override
> public void onClick(AjaxRequestTarget target)
> {
> textField.setDefaultModelObject(new Integer(30));
> target.addComponent(textField);
> }
> };
>
> new test script:
>
> 1- click on the reload link, then you has as expected the text field markup
> presenting the new value on model
> 2 - type something wrong on the text field, like some non numeric characters
> 3 - submit the form. At this moment, you has your forms components on the
> server with the raw input
> 3 - press reload link, to update the markup of the component
> 4 - you has now an text field markup presenting the wrong user typed value,
> and the original one on the component model
>
> For this case modelChanged or clearInput method solves the problem of render
> the form component with his actual model value.
>
> It brings me an question, does store the raw input on server worth?
> pro: user can go back to his form, and has all his input back
> cons: he already get his input back on the render parse, and the browser can
> remember just using html meta tags that require cache
>
>
> On Tue, Feb 23, 2010 at 9:06 AM, Martin Makundi <
> [email protected]> wrote:
>
>> Yes.. don't use referenceToModel. Instead call
>>
>> textField.getDefaultModelObject();
>>
>> **
>> Martin
>>
>> 2010/2/23 Pedro Santos <[email protected]>:
>> > Hi Martin, consider this form:
>> >
>> > java code:
>> > Form form = new Form("form");
>> > add(form);
>> > final TextField<Integer> textField = new TextField("tf", new
>> > Model());
>> > textField.setType(Integer.class);
>> > textField.setOutputMarkupId(true);
>> > form.add(textField);
>> > AjaxLink link = new AjaxLink("reload") {
>> > public void onClick(AjaxRequestTarget target) {
>> > IModel referenceToModel = textField.getDefaultModel();
>> > referenceToModel.setObject(new Integer(30));
>> > target.addComponent(textField);
>> > }};
>> > form.add(link);
>> > form.add(new FeedbackPanel("fp"));
>> >
>> > markup code:
>> >
>> > <form wicket:id="form" >
>> > <input wicket:id="tf" type="text" />
>> > <a wicket:id="reload">reload</a>
>> > <input type="submit" />
>> > <div wicket:id="fp" ></div>
>> > </form>
>> >
>> > In the browser:
>> > 1 - you type something wrong on the text field, like some non numeric
>> > characters
>> > 2 - submit the form. At this moment, you has your forms components on the
>> > server with the raw input
>> > 3 - press reload link, to change the value on the text field model
>> > 4 - you has now an text field presenting the wrong user typed value, and
>> the
>> > new one on the component model on server.
>> >
>> >
>> > On Mon, Feb 22, 2010 at 5:55 PM, Martin Makundi <
>> > [email protected]> wrote:
>> >
>> >> Hi!
>> >>
>> >> What's the difference whether it's thrown away or not if the next step
>> >> is re-submit with new values?
>> >>
>> >> **
>> >> Martin
>> >>
>> >> 2010/2/22 Pedro Santos <[email protected]>:
>> >> > IMO the form processing can be:
>> >> >
>> >> >>
>> >> >> 1. validate
>> >> >> 2. detect error
>> >> >> 3. keep rawinput
>> >> >> 4. re-render error components with red border AND rawinput
>> >> >>
>> >> >
>> >> > 4.1. throw away the raw input in some detach method
>> >> >
>> >> > 5. user retry form submit
>> >> >>
>> >> >
>> >> > 6. all form components get they raw input again since they get
>> rendered
>> >> > before some detach method clear they raw input, no need to maintain
>> those
>> >> > values on the server
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > --
>> >> > Pedro Henrique Oliveira dos Santos
>> >> >
>> >>
>> >
>> >
>> >
>> > --
>> > Pedro Henrique Oliveira dos Santos
>> >
>>
>
>
>
> --
> Pedro Henrique Oliveira dos Santos
>