【问题标题】:How to set JSF input field value before submit如何在提交前设置 JSF 输入字段值
【发布时间】:2012-12-14 09:49:33
【问题描述】:

我有一个带有 PrimeFaces 的 JSF 页面和一些输入字段。在提交完成之前,我想使用字段的值作为方法的输入,该方法执行一些计算并使用结果更新另一个字段但不提交表单。

这是将用作我的方法输入的字段:

<h:outputLabel for="hiredate" value="#{msgs['addUser.hireDate']}" />
                                <p:calendar id="hiredate" value="#{userWizardMB.user.hireDate}" required="true" immediate="true"/>
                                <p:message for="hiredate" />

点击&lt;p:commandButton&gt;即可完成计算:

<p:commandButton value="Calculate days" icon="ui-icon-circle-check" action="#{userWizardMB.calculateVacationDays}" update="vacationDays" process="@this" immediate="true"/>

这是调用的方法:

public void calculateVacationDays() {
        user.setVacationDays((int) vacationDaysCalculator
                .calculateWithHireDate(user.getHireDate()));
}

但是,在调试时,即使我在表单中设置了值,我也看到该字段为 NULL。

我如何强制设置这个字段 - user.hireDate 因为我真的需要这个值来进行计算?

谢谢

编辑:我删除了表单中的所有其他字段和立即属性:

<h:form id="addUserForm">
    <p:wizard widgetVar="wizard" flowListener="#{userWizardMB.onFlowProcess}">
                <!-- TAB FOR PERSONAL DATA -->
                    <p:tab id="personal" title="#{msgs['addUser.personalTab']}">
                        <p:panel header="#{msgs['addUser.personalInformation']}">
                            <p:message for="vacationDays" showDetail="true" autoUpdate="true" closable="true"/>
                            <h:panelGrid columns="3" columnClasses="label, value" styleClass="grid">

                                <h:outputLabel for="hiredate" value="#{msgs['addUser.hireDate']}" />
                                <p:calendar id="hiredate" value="#{userWizardMB.user.hireDate}" required="true" />
                                <p:message for="hiredate" />


                                <h:outputLabel for="vacationDays" value="#{msgs['addUser.vacationDays']}"/>
                                <p:inputText id="vacationDays" value="#{userWizardMB.user.vacationDays}"/>
                                <p:commandButton value="Calculate days" icon="ui-icon-circle-check" action="#{userWizardMB.calculateVacationDays}"  process="@this hiredate" update="vacationDays"/>
                </h:panelGrid>
            </p:panel>
        </p:tab>
    </p:wizard>
</h:form>

并且仍然没有调用 backing bean 方法。

【问题讨论】:

    标签: jsf jsf-2 primefaces


    【解决方案1】:

    从输入和命令组件中删除immediate="true"。不要使用immediate,除非您真的了解它的用途。此外,您还需要在命令组件的update 属性中包含要处理的输入组件。请注意,这应该代表客户端 ID,而不是您的某个 cmets 中提到的属性名称。

    <p:calendar id="hiredate" value="#{userWizardMB.user.hireDate}" required="true" />
    ...
    <p:commandButton value="Calculate days" icon="ui-icon-circle-check" 
        action="#{userWizardMB.calculateVacationDays}" 
        process="@this hiredate" update="vacationDays" />
    

    另见:

    【讨论】:

    • 我添加了您建议的所有内容,并且不再调用我的支持 bean 方法(userWizardMB.calculateVacationDays)?!我不知道为什么会发生这种情况,我在某​​处读到它可能由于其他字段的验证而发生,但即使它们都有有效值,它也不会被调用:(
    • 给定的 sn-p 放在它自己的 &lt;h:form&gt; 中时可以工作。首先尝试排除您从问题中遗漏的其他组件,使其成为问题的实际原因。
    【解决方案2】:

    commandButton 中使用process="@form"(或process="[the id of the calendar component]"

    process="@this" 表示只有与 commandButton 相关的模型部分(通常没有)被更新。

    【讨论】:

    • 我尝试了 process="@form" 并且该字段仍然为空。使用 process="hireDate" 时,不再调用我的支持 bean 方法...
    • 是的,很抱歉没有提供该信息。
    【解决方案3】:

    老问题,但是您是否在 commandButton 标记中添加了partialSubmit="true"?至少在 PrimeFaces 3.5 中,false 是此属性的默认值(请参阅 PrimeFaces PDF 文档)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 2017-02-08
      • 2012-02-12
      • 2011-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多