0

a4j:repeat 内にいくつかのドロップダウン メニューを配置しようとしています。2 番目のドロップダウンの値は、最初に選択した値に依存します。以下は私が使用しようとしているコードですが、空白のパラメーターを渡します:

<a4j:repeat id="localRepeat" var="local" value="#{InstanceController.instance.locations}" rowKeyVar="row">
                    <h:panelGrid columns="2">
                        <h:outputLabel value="Theater:" />
                        <h:selectOneMenu  id="theater" converter="#{TheaterConverter}" value="#{local.theater}">
                            <f:selectItems id="theaters" value="#{InstanceController.allTheaters}" />
                            <a4j:support event="onchange" action="#{InstanceController.getAllCountriesInTheater}" reRender="country" >
                                <f:param name="theater" value="#{local.theater.id}"/>
                            </a4j:support>
                        </h:selectOneMenu>

                        <h:outputLabel value="Country:" />
                        <h:selectOneMenu immediate="true" id="country" converter="#{CountryConverter}" value="#{local.country}">
                            <f:selectItems  value="#{InstanceController.allCountriesInTheater}" />
                            <a4j:support event="onchange" reRender="state" />
                        </h:selectOneMenu>

                    </h:panelGrid>
                    <rich:spacer height="10px" />
                </a4j:repeat>

「#{local.theater.id}」の代わりに「1」を送信するように f:param を変更すると、期待どおりに動作します。

最初のドロップダウンで選択した値を取得し、それをパラメーターとして送信する方法はありますか?

4

1 に答える 1

2

これが機能しない理由は、f:paramタグがレンダリングされるときに、local.theater.idの現在の値がすでにパラメーターに割り当てられているためです。したがって、theatre paramには、ページがレンダリングされたときに選択された劇場のIDが含まれます。劇場がまだ選択されていないため、おそらくnullです。

あなたがやろうとしていることははるかに簡単です:f:paramを削除してプロパティを直接使用するだけです。selectboxの値が変更されたためにa4j:supportタグがトリガーされると、jsfはフォームタグを検証し、適切なモデル値を割り当てます。したがって、getAllCountriesInTheaterアクションが実行されると、local.theaterプロパティにはすでに選択された劇場が含まれています。

バッキングBeanの設計方法によっては、選択ボックスが変更された場所を識別するためのパラメーターが必要になる可能性があります。そのため、getAllCountriesInTheaterアクションは、選択された劇場を探す場所を認識します。

于 2009-11-06T13:05:12.713 に答える