在视图范围内的托管bean中,我使用 <p:resetInput> 来清除相应托管bean中的属性所持有的值,例如,

<p:commandButton value="Reset" update="panel" process="@this">
    <p:resetInput target="panel" />
</p:commandButton>

这很好。

我有一个提交按钮<p:commandButton>,如果验证成功,当按下该按钮时,会将提交的值插入数据库中。
<p:remoteCommand name="updateTable" update="dataTable"/>

<p:panel id="panel" header="New">
    <p:outputLabel for="property1" value="property1"/>

    <p:inputText id="property1" value="#{bean.property1}" required="true">
        <f:validateLength minimum="2" maximum="100"/>
    </p:inputText>

    <p:message for="property1" showSummary="false"/>

    <p:commandButton id="btnSubmit"
                     update="panel messages"
                     oncomplete="if(!args.validationFailed) {updateTable();}"
                     actionListener="#{bean.insert}"
                     value="Save"/>

    <p:commandButton value="Reset" update="panel" process="@this">
        <p:resetInput target="panel" />
    </p:commandButton>
</p:panel>

命令按钮将调用托管Bean中的insert()方法,该方法定义如下。
public void insert() {
    if (service.insert(property1)) {
        //...Popup a success message.
        reset(); //Invoke the following private method.
    } else {
        //...Show the cause of the failure.
    }
}

private void reset() {
    property1 = null; //Set this property of type String to null.
}

如果省略此reset()方法,则不会明显清除<p:inputText>,但是如果我按XHTML中所示按下reset按钮,应清除<p:inputText>,但不会清除。

showcase example演示了完全相同的事情。因此,这种行为似乎已被记录在案,但是我不明白为什么如果省略<p:resetInut>方法,那么property1不清除reset()的值吗?

最佳答案

<p:resetInput>不会清除模型值,就像您错误预期的那样。它只是清除输入组件的状态,该状态在验证错误后可能很脏。
此答案中详细描述了它要解决的具体问题:How can I populate a text field using PrimeFaces AJAX after validation errors occur?
通过以下用例可以最好地理解这一点:

  • 您具有一个具有单个数据表的单个视图和一个对话框,该对话框显示当前选定的记录以进行编辑。
  • 您打开对话框并使用无效值提交其表单。输入组件标记为无效并突出显示为红色。
  • 您关闭对话框而不修复错误。
  • 然后选择同一行或另一行进行编辑。对话框出现,但输入组件仍标记为无效并突出显示为红色,并显示旧的提交值(如果有的话),因为它仍与您使用的视图状态相同。

  • 将带有目标的<p:resetInput>放置在“打开对话框”按钮中的对话框表单上即可修复该问题。
    我不确定您的特殊情况是否是正确的用例,而<p:resetInput>是正确的解决方案。您的代码不完整,您也没有在任何地方声明此代码背后的具体功能要求,但据我所知,没有多个输入/表单需要相互更新。我相信,即使您删除<p:resetInput>,您的情况仍然可以解决。因此,在您的上下文中这将是完全多余的,您可以清除模型(或者仅通过使用同步GET按钮刷新页面来隐式地重新创建视图)。
    也可以看看:
  • PrimeFaces CommandButton that Doesn't Process Data
  • Escape a primefaces/jsf page that has required fields
  • 07-28 08:45