为什么p:resetInput要求在提交表单后首先将托管bean的属性设置为null?

时间:2013-07-16 10:57:20

标签: jsf jsf-2 primefaces

在视图范围内的托管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中显示的重置按钮,<p:inputText>应该被清除,但它不会“T

showcase example表现出完全相同的东西。因此,此行为似乎已记录在案,但我不明白为什么<p:resetInut>不清除property1的值,如果省略reset()方法,在这种情况下?

1 个答案:

答案 0 :(得分:8)

<p:resetInput>并未清除您错误预期的模型值。它只是清除输入组件的状态,在验证错误后它可能是脏的。

本答案详细描述了它试图解决的具体问题:How can I populate a text field using PrimeFaces AJAX after validation errors occur?

以下用例可以最好地理解这一点:

  1. 您有一个包含单个数据表的视图和一个显示当前所选记录以供编辑的对话框。
  2. 您打开对话框并使用无效值提交其表单。输入组件标记为无效并以红色突出显示。
  3. 关闭对话框而不修复错误。
  4. 然后选择相同或另一行进行编辑。对话框显示,但输入组件仍然标记为无效并突出显示为红色并显示旧的提交值-if any-因为它仍然与您正在使用的视图状态相同。
  5. 在“打开的对话框”按钮中将<p:resetInput>与目标放在对话框的表单上可以修复它。

    我不确定您的特定情况是否是<p:resetInput>是正确解决方案的正确用例。您的代码不完整,并且您没有在任何地方说明此代码背后的具体功能要求,但据我所知,没有多个输入/表单需要相互更新。即使您删除<p:resetInput>,我相信您的案例仍然有效。因此,在您的上下文中它将是完全超级的,您可以放弃清除模型(或者只是通过同步GET按钮刷新页面,隐式重新创建视图)。

    另见: