selectoneMenu更改事件不适用于一个值

时间:2013-01-18 08:37:07

标签: jsf-2 selectonemenu

我的程序中有两个下拉菜单,第二个菜单根据第一个选定的值填充。

当第一个菜单中只有一个值时,第二个菜单不会反映这些值,但是当我有多个值时它会起作用。可能导致错误的原因是什么?

以下是代码:

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

1 个答案:

答案 0 :(得分: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));
}