我试图在a4j中放下几个下拉菜单:重复。第二个下拉列表的值取决于第一个下拉列表中选择的值。下面是我尝试使用的代码,但它传递了一个空白参数:
<a4j:repeat id="localRepeat" var="local" value="#{InstanceController.instance.locations}" rowKeyVar="row">
<h:panelGrid columns="2">
<h:outputLabel value="Theater:" />
<h:selectOneMenu id="theater" converter="#{TheaterConverter}" value="#{local.theater}">
<f:selectItems id="theaters" value="#{InstanceController.allTheaters}" />
<a4j:support event="onchange" action="#{InstanceController.getAllCountriesInTheater}" reRender="country" >
<f:param name="theater" value="#{local.theater.id}"/>
</a4j:support>
</h:selectOneMenu>
<h:outputLabel value="Country:" />
<h:selectOneMenu immediate="true" id="country" converter="#{CountryConverter}" value="#{local.country}">
<f:selectItems value="#{InstanceController.allCountriesInTheater}" />
<a4j:support event="onchange" reRender="state" />
</h:selectOneMenu>
</h:panelGrid>
<rich:spacer height="10px" />
</a4j:repeat>
如果我更改f:param以发送“1”而不是“#{local.theater.id}”,它将按预期工作。
有没有办法获取第一个下拉列表的选定值并将其作为参数发送?
答案 0 :(得分:2)
这不起作用的是当渲染f:param标记时,local.theater.id的当前值已经分配给参数。因此,剧院参数将包含在呈现页面时选择的剧院的ID - 可能为空,因为尚未选择剧场。
您要做的事情要容易得多: 只需删除f:param并直接使用该属性即可。当a4j:support标签触发因为selectbox值已更改时,jsf将验证您的表单标签并分配相应的模型值。因此,当执行getAllCountriesInTheater操作时,local.theater属性将已包含所选的影院。
根据您的支持bean的设计方式,您可能需要一个参数来标识更改选择框的位置,因此getAllCountriesInTheater操作将知道要查找所选影院的位置。