JSF 2 - 无法做必需的输入+清除(立即)按钮?

Ben*_*Ben 2 jsf jsf-2

这个问题与此处的问题类似,但该解决方案在此处不起作用.

以这个简单到最大的例子为例:

<h:form>
  <h:inputText required="true" value="#{mrBean.someValue}" />
  <h:inputText required="true" value="#{mrBean.someValue2}" />

  <h:commandButton value="Submit">
    <f:ajax execute="@form" />
  </h:commandButton>
  <h:commandButton immediate="true" action="#{mrBean.clearAllValues}" value="Clear">
    <f:ajax render="@form" />
  </h:commandButton>

</h:form>
Run Code Online (Sandbox Code Playgroud)

和豆代码:

public void clearAllValues() {
    setSomeValue(null);
    setSomeValue2(null);
}
Run Code Online (Sandbox Code Playgroud)

采取这种情况:

  • 在第一个输入中输入"X"值
  • 使用"提交"按钮提交.(验证失败)
  • 在同一输入中输入"Y".
  • 单击"清除"按钮.
  • 结果:输入未清除,第一个输入的值返回"X".

我希望这个场景能够清除输入值,但它不会恢复"X",这是先前提交的值.它实际上从来没有真正运行mrBean.getSomeValue()在bean上(这将返回null并清除输入字段)

问题与JSF不能很好地处理必填字段和立即有关.我想知道是否有人设法克服了这个问题.

谢谢!本.

Bal*_*usC 5

您的代码示例过于简单.只有在有多个必需输入时,才会出现所描述的问题症状.在示例中添加一个必需的输入字段.只填写其中一个.空的验证错误将发生.然后在两者中输入其他内容并按清除.有效输入确实将保留先前提交的值.

此问题和本博客文章中详细介绍了此问题.解决方案归结为收集所有待清除的输入组件并调用每个组件.这可以通过博客文章中所示的方式完成.EditableValueHolder#resetValue()<f:actionListener>

在您的特定情况下,另一种方法,因为您只想清除整个表单是使用一个<h:button>基本上只刷新页面.如果您的bean是请求或视图作用域,那么它也将被重新创建,并且所有属性都设置为default.

<h:form>
  <h:inputText required="true" value="#{mrBean.someValue}" />

  <h:commandButton value="Submit">
    <f:ajax execute="@form" />
  </h:commandButton>
  <h:button value="Clear" />
</h:form>
Run Code Online (Sandbox Code Playgroud)