a4j:support - 从 h:selectOneMenu 检索到的值始终为 NULL
a4j:support - Value retrieved from h:selectOneMenu is always NULL
有一个数据表,每行有一个 h:selectOneMenu。我希望能够在 bean 的 selectOneMenu 中检索值 selected。我正在使用 richfaces a4j:support 标记对支持 bean 进行 AJAX 调用。您可以看到下面的代码:
数据表header:
<t:dataTable id="datatable" var="row" value="#{myBean.dataTableRows}">
使用 A4j 的 SelectOneMenu:
<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>
要执行的Backing Bean方法:
public void executeAjax(ActionEvent event){
ValueHolder comboBox = (ValueHolder) event.getComponent().getParent();
comboBox .getValue();
}
- comboBox .getValue() 返回 NULL,即使我 select 一个值。
PS:
此问题已被确定为可能与 重复,但事实并非如此。我的问题使用 dataTable 并且不对每个元素使用绑定。另外,我使用的是 JSF 1.1 和 RichFaces 3.3.3。
已确定问题:
t:selectItems 标签生成的每个 "option" 都带有项目 ID 而不是索引,而 comboConverter 使用 select 项目的索引。因此,该列表有 12 个项目(索引范围应为 0 到 11),但 selected 项目的 id 例如为 22。然后转换器将遍历列表到索引 22 并检索元素。但是这个列表中没有这样的索引,因为最大值是 12 然后转换器总是 return NULL.
这个问题基本上有3种方法可以解决:
- 创建一个新的转换器,通过它的 id 查找项目
- Adapt/Change "comboConverter" 通过 id 查找项目(这样做会影响使用此转换器的其他代码段
- 调整列表以使用索引而不是 ID
我选择了第一个,因为对系统影响较小
有一个数据表,每行有一个 h:selectOneMenu。我希望能够在 bean 的 selectOneMenu 中检索值 selected。我正在使用 richfaces a4j:support 标记对支持 bean 进行 AJAX 调用。您可以看到下面的代码:
数据表header:
<t:dataTable id="datatable" var="row" value="#{myBean.dataTableRows}">
使用 A4j 的 SelectOneMenu:
<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>
要执行的Backing Bean方法:
public void executeAjax(ActionEvent event){
ValueHolder comboBox = (ValueHolder) event.getComponent().getParent();
comboBox .getValue();
}
- comboBox .getValue() 返回 NULL,即使我 select 一个值。
PS:
此问题已被确定为可能与
已确定问题:
t:selectItems 标签生成的每个 "option" 都带有项目 ID 而不是索引,而 comboConverter 使用 select 项目的索引。因此,该列表有 12 个项目(索引范围应为 0 到 11),但 selected 项目的 id 例如为 22。然后转换器将遍历列表到索引 22 并检索元素。但是这个列表中没有这样的索引,因为最大值是 12 然后转换器总是 return NULL.
这个问题基本上有3种方法可以解决:
- 创建一个新的转换器,通过它的 id 查找项目
- Adapt/Change "comboConverter" 通过 id 查找项目(这样做会影响使用此转换器的其他代码段
- 调整列表以使用索引而不是 ID
我选择了第一个,因为对系统影响较小