在下拉列表中根据值更改调用JSF中的ValueChangeListener时,它调用该页面上的所有ValueChangeListner。
DataTable中有两个valueChangeListener,同时在一个dropdwon中更改值,第二个也在执行。
<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>
答案 0 :(得分:1)
仅值更改不会自动调用valueChangeListener
。您还需要提交表格。常用的“黑客”是在form.submit()
事件期间使用JavaScript调用onchange
。但是,这将提交整个表单。确实会为表单中所有已更改的字段触发valueChangeListener
。
要在JSF 1.x中修复此问题,您需要使用immediate
属性稍微麻烦,以跳过所有其他表单组件进行验证并使用组件binding
,以便您可以正确获取/设置其他组件的价值。长话短说,我曾写过一篇关于此的文章:populate child menus in JSF 1.2。
在JSF 2.0中,借助<f:ajax>
标记可以更轻松地实现这一点。如果你真的使用的是JSF 2.0(你当前的问题没有表明),那么请告诉我你是否需要一个例子。