在JSF中根据下拉列表中的值变化调用ValueChangeListener时,它调用该页面上的所有ValueChangeListner。
在valueChangeListener中有两个DataTable,而在一个下拉列表中更改值时,第二个也在执行。
<t:column id="avlId" styleClass="coltextcenteralign">
<f:facet name="header">
<h:panelGroup>
<h:outputText value="#{bundle['travelLocalAccommodation.title.availability']}" />
<h:outputText value="*" style="color:red" />
</h:panelGroup>
</f:facet>
<t:selectOneMenu value="#{accomDtls.availability}" immediate="true"
valueChangeListener="#{TravelProcessingBB.localAccommodationBB.setAvailableFlag}" forceid="true" id="avl"
onchange="return availabilityAlert('#{accomDtls.prepopulatedFlag}','avl[#{table_count}]')"
styleClass="dropDownStyle" style="width:50">
<f:selectItem itemValue="Y" itemLabel="Yes" />
<f:selectItem itemValue="N" itemLabel="No" />
</t:selectOneMenu>
</t:column>发布于 2011-05-09 11:34:54
仅值更改不会自动调用valueChangeListener。你也需要提交表格。一个常用的"hack“是在form.submit()事件期间使用JavaScript调用onchange。然而,这将提交整个表单。确实,对于表单中所有更改的字段,都将触发valueChangeListener。
要在JSF1.x中解决这个问题,您需要使用immediate属性来跳过所有其他表单组件的验证和组件binding,以便正确地获取/设置其他组件的值。长话短说,我曾经写过一篇文章:在JSF1.2中填充子菜单。
但是,在JSF2.0中,使用<f:ajax>标记可以更容易地实现这一点。如果您确实在使用JSF2.0(您当前的问题没有说明这一点),那么如果您需要一个示例,请告诉我。
https://stackoverflow.com/questions/5935213
复制相似问题