我有一个wicket表单,其中包含许多TextField输入组件.大多数输入都附有Validator.
假设我输入了50个值,其中一个值未通过范围验证器.Wicket然后生成错误反馈消息,但也不更新与每个组件关联的模型.结果是我丢失了刚刚输入的所有50个值,并且必须再次键入它们.
我的问题是,我可以告诉Wicket更新那些具有有效值的组件的模型,但只报告错误值的错误吗?
在框架中挖掘,我注意到FormComponent中的这个代码片段,它似乎表明如果有错误,则不要更新模型.
public final void processInput()
{
inputChanged();
validate();
if (hasErrorMessage())
{
invalid();
}
else
{
valid();
updateModel();
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法自定义此行为,并实现保留所有有效值的目的?
我敢打赌,FormComponent.processInput()这里根本没有被召唤.当你提交Form,Form.process()被叫.在那里,它将Form.validate()调用Form.validateComponents(),最终将调用,最终使用FormComponent.validate().
你在这里遇到的问题是全球处理问题Form.process().表格完全提交,或根本提交.当FormComponent.validate()失败时,Form.hasError()将返回true,因此Form.process()永远不会更新任何模型.
你可以:
FormValidator.在那里,您可以选择更新FormComponents通过其验证的模型.Form.onError()在那里实现并使用访问者来更新有效的模型FormComponents.Form.process()并修改// If a validation error occurred分支以使用您自己的方法将组件标记为有效/无效,并根据FormComponent有错误更新(或不更新)模型对象.FormComponent.hasErrorMessage()会告诉你验证是否失败了FormComponent.UPDATE
在讨论了使用OP丢失用户输入的原因之后,结果发现FormComponents正在添加到ListView未setReuseItems设置的内容中true.这导致FormComponents每个都重新创建ListView.populateItem(),因此失去所有用户输入.
有关此问题性质的更多信息,请访问:
但是,在表单中使用转发器时,您需要注意一些规定.通常,重复者在每个请求开始时清除它们的项目,当在表单内部时,这通常是不合需要的,因为您希望保留旧项目,因为您希望它们保持其状态而不是重新创建.
例如,如果使用ListView,则应在表单内调用ListView.setReuseItems(true),以便保留旧项而不是每次都创建新项.
| 归档时间: |
|
| 查看次数: |
2826 次 |
| 最近记录: |