1

私は、いくつかの入力フィールドを持つ 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" />

をクリックすると計算が行われます<p:commandButton>

<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 の設定を強制するにはどうすればよいですか? 計算にはこの値が本当に必要なので?

ありがとうございました

編集:フォーム内の他のすべてのフィールドとimmediate属性を削除しました:

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

また、バッキング Bean メソッドはまだ呼び出されていません。

4

3 に答える 3

1

immediate="true"入力およびコマンド コンポーネントから削除します。使用目的を本当に理解していimmediateない限り、使用しないでください。さらにコマンドコンポーネントの属性に処理したい入力コンポーネントを含める必要があります。これは、コメントの1つに記載されているプロパティ名ではなく、クライアントIDを表す必要があることに注意してください。update

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

以下も参照してください。

于 2012-12-14T11:50:22.180 に答える
0

古い質問ですがpartialSubmit="true"、commandButton タグを追加しましたか? 少なくとも PrimeFaces 3.5 では、false がこの属性のデフォルト値です (PrimeFaces PDF ドキュメントを参照してください)。

于 2013-07-16T00:06:08.627 に答える
0

使用(process="@form"またはprocess="[the id of the calendar component]"commandButton

process="@this"commandButton に関連するモデルの部分 (通常はなし) のみが更新されることを意味します。

于 2012-12-14T09:53:03.050 に答える