在根据下拉列表中的值更改调用JSF中的ValueChangeListener时,它正在调用该页面上的所有ValueChangeListner。
DataTable中有两个valueChangeListener,而在一个dropd中更改值,第二个也执行。
<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>
值更改本身不会自动调用valueChangeListener
。您还需要提交表格。一个常用的"hack"是在onchange
事件期间使用 JavaScript 调用form.submit()
。但是,这将提交整个表单。实际上,将为表单的所有已更改字段触发valueChangeListener
。
要在 JSF 1.x 中解决此问题,您需要使用 immediate
属性来跳过所有其他表单组件的验证和组件binding
,以便您可以正确获取/设置其他组件的值。长话短说,我曾经写过一篇关于这个问题的文章:在 JSF 1.2 中填充子菜单。
然而,在 JSF 2.0 中,借助<f:ajax>
标记更容易实现这一点。如果您确实在使用 JSF 2.0(您当前的问题没有表明这一点),那么如果您需要示例,请告诉我。