我有一个wicket表单,其中包含许多TextField输入组件。大多数输入附有一个验证器。
假设我输入了50个值,其中一个值未通过范围验证器。 Wicket然后生成错误反馈消息,但也不更新与每个组件关联的模型。结果是我丢失了刚刚输入的所有50个值,并且必须再次键入它们。
我的问题是,我可以告诉Wicket更新那些具有有效值的组件的模型,但只报告错误值的错误吗?
在框架中挖掘,我注意到FormComponent中的这个代码片段,似乎表明如果有错误,则不要更新模型。
public final void processInput()
{
inputChanged();
validate();
if (hasErrorMessage())
{
invalid();
}
else
{
valid();
updateModel();
}
}
有没有办法自定义此行为,并实现保留所有有效值的目的?
答案 0 :(得分:7)
我敢打赌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
验证失败。更新
在讨论了OP丢失用户输入的原因之后,结果发现FormComponents
被ListView
添加到setReuseItems
没有true
设置为{{1} }}。这导致FormComponents
在每个ListView.populateItem()
上重新创建,因此丢失了所有用户输入。
可以找到有关此问题性质的更多信息here:
但是,使用时必须注意一些规定 表格中的转发器。通常中继者清除他们的项目 每个请求的开头,通常在表单内部时 因为你想保留旧物品而不受欢迎 希望他们保持自己的状态而不是重新创造新鲜感。
例如,如果您使用ListView,则应该调用 ListView.setReuseItems(true)在表单内部,以便保留旧的 项目而不是每次都创建新的项目。