我的程序中有两个下拉菜单,第二个菜单根据第一个选定的值填充。
当第一个菜单中只有一个值时,第二个菜单不会反映这些值,但是当我有多个值时它会起作用。可能导致错误的原因是什么?
以下是代码:
<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>
答案 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));
}