有一个数据表,每行都有一个h:selectOneMenu。我希望能够检索在 bean 的 selectOneMenu 中选择的值。我正在使用 richfaces a4j:support 标签来对支持豆进行 AJAX 调用。您可以看到下面的代码:
数据表标题:
<t:dataTable id="datatable" var="row" value="#{myBean.dataTableRows}">
选择带有 A4j 的菜单:
<h:selectOneMenu id="type" label="Type:" styleClass="tamanho80"
value="#{datatableHolder.selectedValue}" converter="comboConverter" immediate="true" >
<f:selectItem itemValue="#{null}" itemLabel="" />
<t:selectItems var="tp"
itemValue="#{tp}" itemLabel="#{tp.nome}"
value="#{row.comboTypeValues}" />
<f:attribute name="row" value="#{row}"/>
<a4j:support event="onchange" reRender="parent" actionListener="${myBean.executeAjax}" immediate="true" ajaxSingle="true" />
</h:selectOneMenu>
要执行的后备 Bean 方法:
public void executeAjax(ActionEvent event){
ValueHolder comboBox = (ValueHolder) event.getComponent().getParent();
comboBox .getValue();
}
- comboBox .getValue() 返回 NULL,即使我选择一个值也是如此。
附注:
这个问题已被确定为这个问题的可能重复,但事实并非如此。我的问题使用数据表,并且不对每个元素使用绑定。另外,我正在使用JSF 1.1和RichFaces 3.3.3。
已确定问题:
t:selectItems 标签生成的每个"选项"都带有项目 ID 而不是索引,而 comboConverter 使用索引来选择项目。因此,列表有 12 个项目(索引范围应介于 0 到 11 之间),但所选项目的 id 例如为 22。然后转换器将遍历列表到索引 22 并检索元素。但是,此列表中没有这样的索引,因为最大值为 12,然后转换器将始终返回 NULL。
对于这个问题,基本上有3种方法可以解决:
- 创建一个新的转换器,按项的 id 查找该项
- 调整/更改"comboConverter"以按其 id 查找项目(这样做会影响使用此转换器的其他代码段
- 调整列表以使用索引而不是 id
我选择了第一个,因为对系统的影响很小。