我有一个包含许多TextField输入组件的 wicket 表单。这些输入中的大多数都带有 validator 。
假设我输入了50个值,其中一个值没有通过范围 validator 。然后,Wicket会生成错误反馈消息,但不会更新与每个组件关联的模型。结果是我丢失了我刚刚输入的所有50个值,而不得不再次输入它们。
我的问题是,我可以告诉Wicket更新那些具有有效值的组件的模型,而只是报告错误值的错误吗?
深入研究框架,我注意到FormComponent中的这段代码片段,这似乎表明如果有错误,则不要更新模型。
public final void processInput()
{
inputChanged();
validate();
if (hasErrorMessage())
{
invalid();
}
else
{
valid();
updateModel();
}
}
有什么方法可以自定义此行为,并达到我保留所有有效值的目的?
最佳答案
我敢打赌,这里根本没有调用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
中。这导致在每个FormComponents
上重新创建ListView.populateItem()
,因此丢失了所有用户输入。有关此问题的性质的更多信息,可以找到here: