2

私のプログラムには 2 つのドロップダウン メニューがあり、2 つ目は最初に選択した値に基づいて入力されます。

最初のメニューに値が 1 つしかない場合、2 番目のメニューには値が反映されませんが、複数の値がある場合は機能します。エラーの原因は何ですか?

コードは次のとおりです。

<h:selectOneMenu id="blSearchFacilityInput"
                 value="#{bLDashBoardAction.facilityId}" style="width:80px;">
    <f:ajax event="valueChange" render="blSearchzoneInput"
            listener="#{bLDashBoardAction.facValueChangeEvent}"/> 
    <f:selectItems value="#{bLDashBoardAction.svaFaciltyList}" var="c"
                   itemLabel="#{c.facCode}" itemValue="#{c.id}"/>
</h:selectOneMenu>
<h:selectOneMenu id="blSearchzoneInput" value="#{bLDashBoardAction.zoneId}"
                 style="width:80px;">
    <f:ajax event="valueChange" render="blSearchSectorInput"
            listener="#{bLDashBoardAction.zoneValueChangeEvent}"/>
    <f:selectItems value="#{bLDashBoardAction.zoneList}" var="c"
                   itemLabel="#{c.zoneCode}" itemValue="#{c.zoneId}"/>
</h:selectOneMenu>
4

1 に答える 1

1

デフォルトですでに事前選択されている項目が 1 つしかない場合は、もう一度選択しようとしても実質的に変更はありません。変更イベントをトリガーするには、物理​​的な 2 番目のアイテムが本当に必要です。

null値またはを持つ別のアイテムを追加しますnoSelectionOption="true"

<h:selectOneMenu id="blSearchFacilityInput"
                 value="#{bLDashBoardAction.facilityId}" style="width:80px;">
    <f:ajax render="blSearchzoneInput"
            listener="#{bLDashBoardAction.facValueChangeEvent}"/> 
    <f:selectItem itemLabel="--select one--" noSelectionOption="true" />
    <f:selectItems value="#{bLDashBoardAction.svaFaciltyList}" var="c"
                   itemLabel="#{c.facCode}" itemValue="#{c.id}"/>
</h:selectOneMenu>

これで、値変更イベントを正常にトリガーできます。これはすでにデフォルトのイベントであるため、簡潔にするためにコードから省略しました。デフォルトを繰り返す必要はありません。

別の方法として、親ドロップダウンに項目が 1 つしかない場合、子ドロップダウンを自動的に事前入力することもできます。たとえば、その瞬間の直後にsvaFacilityList:

if (svaFaciltyList.size() == 1) {
    zoneList = fillItBasedOn(svaFaciltyList.get(0));
}
于 2013-01-18T11:34:43.517 に答える