我有一个包含许多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()将永远不会更新任何模型。

你可以:

  • 将所有独立于FormComponent的验证移动到FormValidator。您可以在此处选择更新通过验证的FormComponents的模型。
  • 实现Form.onError()并在那里使用访问者来更新有效FormComponents的模型。
  • 覆盖Form.process()并修改 // If a validation error occurred 分支,以使用您自己的方法将组件标记为有效/无效,并根据存在错误的FormComponent更新(或不更新)模型对象。 FormComponent.hasErrorMessage()会告诉您某个FormComponent的验证是否失败。


  • 更新

    在讨论了使用OP丢失用户输入的原因之后,事实证明,FormComponents被添加到没有将ListView设置为setReuseItemstrue中。这导致在每个FormComponents上重新创建ListView.populateItem(),因此丢失了所有用户输入。

    有关此问题的性质的更多信息,可以找到here:

    10-04 11:58