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

时间:2012-03-27 08:43:17

标签: jsf jsf-2

此问题类似于问题here,但该解决方案在此处不起作用。

采用这个简单到最大的例子:

<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>

和bean代码:

public void clearAllValues() {
    setSomeValue(null);
    setSomeValue2(null);
}

采取这种情况:

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

我希望这个场景能够清除输入值,但它不会恢复“X”,即先前提交的值。它实际上从未在bean上运行mrBean.getSomeValue()(它将返回null并清除输入字段)

问题与JSF无法正常使用必填字段有关。我想知道是否有人设法克服了这个问题。

谢谢! 本。

2 个答案:

答案 0 :(得分:5)

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

this questionthis blog article详细介绍了此问题。解决方案归结为收集所有待清除的输入组件并在每个组件上调用EditableValueHolder#resetValue()。这可以使用<f:actionListener>来完成,如博客文章中所示。

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

<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>

答案 1 :(得分:0)

你确定clearAllValues被执行了吗?你在日志或控制台中有任何错误吗? 尝试添加执行

<f:ajax render="@form" execute="@this">