0

Seam で webapp を作成していますが、解決できない問題に遭遇しました。

顧客がコンボボックスから予約タイプを選択できる JSF フォームがあります。選択した値に基づいて、他のフォーム コンポーネントがレンダリングされます。

例: 顧客が予約タイプとして時間を選択すると、顧客が開始時間と終了時間を選択できる panelGroup がレンダリングされます。ただし、顧客が予約タイプとして「1 日の一部」を選択した場合、1 日の一部 (朝、午後、夕方) を選択できる selectOneMenu がレンダリングされます。

再レンダリングはうまくいきますが、レンダリングされた条件付きのコンポーネントの値は Bean に渡されません。それらは null 値のままです。

これは私が話しているコードです:

<s:div id="spot"
       rendered="#{selectedProduct.productType.name eq 'Flex Spot'}">

    <h:panelGrid columns="2">
        <h:outputText value="Reservation Type" />
        <h:selectOneMenu value="#{selectedPeriodPart}">
            <s:selectItems
                value="#{productManager.getAvailableDayPartsSpot()}"
                var="daypart"
                label="#{daypart.label}"></s:selectItems>
            <s:convertEnum />

            <a4j:support ajaxSingle="true"
                         event="onchange"
                         action="#"
                         reRender="spot">
            </a4j:support>
        </h:selectOneMenu>

        <h:outputText id="date_spot" value="Date" />

        <a4j:outputPanel id="calendar_spot" layout="block">
            <rich:calendar value="#{reservation.reservationPeriod.startDate}"
                           locale="en" cellWidth="24px"
                           cellHeight="22px"
                           style="width:200px" />
        </a4j:outputPanel>

        <h:outputText rendered="#{selectedPeriodPart eq 'DAY_PART'}"
                      value="Daypart" />

        <h:selectOneMenu value="#{selectedDaypart}"
                         rendered="#{selectedPeriodPart eq 'DAY_PART'}">
            <f:selectItem id="si_morning" itemLabel="Morning (6:00 - 12:00)"
                          itemValue="morning" />
            <f:selectItem id="si_afternoon"
                          itemLabel="Afternoon (12:00 - 18:00)" itemValue="afternoon" />
            <f:selectItem id="si_evening" itemLabel="Evening (18:00 - 00:00)"
                          itemValue="evening" />
        </h:selectOneMenu>

        <h:outputText rendered="#{selectedPeriodPart eq 'HOURS'}"
                      value="Hours" />

        <h:panelGroup id="hours_spot"
                      rendered="#{selectedPeriodPart eq 'HOURS'}">
            <ui:include src="/includes/reservation/select_hours.xhtml" />
        </h:panelGroup>
    </h:panelGrid>
</s:div>

注: カレンダーの値は Bean に戻されますが、このコードの値は渡されません (レンダリングされた条件を削除すると渡されます)。

selectOneMenu value="#{selectedDaypart}" rendered="#{selectedPeriodPart eq 'DAY_PART'}"
4

2 に答える 2

0

修正しました -.- 投稿したコードに問題はありませんでした。この問題を解決できなかったので、同じ会話の別のページに進みました。さらに奇妙な動作に気付きました: 変数のアウトジェクションが機能しないなどです。

間違いはコードの他の部分にあり、修正後に問題全体が修正されたと思いました。

みんなに答えてくれてありがとう!

于 2010-05-11T15:20:22.500 に答える
0

renderedフォーム送信の後続のリクエストでも、属性の結果に関与する条件が同じであることを確認する必要があります。コンポーネントがレンダリングされない場合、JSF はリクエストの値を適用しないためです。

簡単に言えば、背後のプロパティ#{selectedPeriodPart}は、後続のリクエストで同じである必要があります。いくつかの解決策があります。

  1. Bean をセッション スコープに入れます。最も簡単な解決策ですが、サーバーのメモリとクライアントのエクスペリエンスに悪影響を及ぼします (更新は同じセッションの複数のタブ/ウィンドウに反映されます)。

  2. を使用して渡し<h:inputHidden>ます。これが Ajax/Richfaces の図にどのように適合するかはわかりません。ここを使ったほうがいい<a4j:keepAlive>

  3. 会話スコープを使用します。Seam はこのための機能を提供します。

于 2010-05-11T13:10:52.777 に答える