3

在视图范围的托管 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>

命令按钮调用insert()托管 bean 中的方法,该方法定义如下。

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>应该清除但它没有。

展示示例演示了完全相同的内容。因此,这种行为似乎已记录在案,但我不明白为什么不<p:resetInut>清除 的值property1,如果该reset()方法被省略,在这种情况下?

4

1 回答 1

8

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

它试图解决的具体问题在这个答案中有详细描述:How can I populate a text field using PrimeFaces AJAX after validation errors?

以下用例最能理解这一点:

  1. 您有一个带有单个数据表的视图和一个显示当前选择的记录以供编辑的对话框。
  2. 您打开对话框并使用无效值提交其表单。输入组件被标记为无效并以红色突出显示。
  3. 您关闭对话框而不修复错误。
  4. 然后选择同一行或另一行进行编辑。对话框出现,但输入组件仍被标记为无效并突出显示为红色,并显示旧提交的值 - 如果有的话 - 因为它仍然是您正在使用的相同视图状态。

在“打开对话框”按钮中将目标放在<p:resetInput>对话框的表单上可以修复它。

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

也可以看看:

于 2013-07-16T11:06:47.687 回答