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

如果默认情况下只有一个项目已经预先选择,那么当您再次尝试选择它时实际上没有任何变化。您确实需要物理第二项才能触发更改事件。

添加另一个带有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>

现在您可以成功触发值更改事件。请注意,它已经是默认事件,因此为了简洁起见,我从代码中省略了它。无需重复默认设置。

如果父下拉列表中只有一个项目,另一种方法是自动预填充子下拉列表。例如,在您填写的那一刻之后svaFacilityList

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