我有一个列出一些对象的dataTable,我想使用selectOneListbox为这些对象设置一个属性。这是我的数据表
<h:dataTable value="#{someHandler.entities}"
binding="#{someHandler.dataTable}" var="entitiy">
<h:column>
<f:facet name="header">
<t:outputText value="Level" />
</f:facet>
<h:selectOneListbox id="level" value="#{entitiy.level}" size="1"
valueChangeListener="#{someHandler.changeLevel}"
onchange="submit()">
<f:selectItem itemValue="-" itemLabel="-" />
<f:selectItem itemValue="ALL" itemLabel="ALL" />
(and so on)
</h:selectOneListbox>
</h:column>
<h:column>
<f:facet name="header">
<t:outputText value="Name" />
</f:facet>
<h:outputText value="#{entitiy.name}" />
</h:column>
</h:dataTable>
valueChangeListener 如下所示:
public void changeLevel(ValueChangeEvent event) {
String newLevel = (String) event.getNewValue();
Logger logger = (Logger) dataTable.getRowData();
logger.setLevel(Level.toLevel(newLevel));
}
(dataTable 是一个 HtmlDataTable 对象。
但是,事件对象始终相同 - 无论 selectOneListbox 位于哪一行。(似乎总是第一行中的记录器)。我得到的记录器对象也不是我想要的对象。
有什么想法吗?谢谢!
另一个问题呢?entitiy.setLevel() 方法是否被调用,即使我有一个 valueChangeListener?我使用 entitiy.level 是因为我想将所选级别显示为这些实体的默认值。
谢谢!
这里有两个潜在的问题:
首先,onchange="submit()"
提交整个表单。将在提交值与初始值不同的所有输入元素上调用valueChangeListener
。
您需要使用与默认菜单选项相同的值预设#{entitiy.level}
后面的值。 例如,在构造函数中。
public Entity() {
level = "-";
}
或者,更好的是,将默认值设为 null
。
<f:selectItem itemValue="#{null}" itemLabel="-" />
这样,当特定菜单未更改时
,不会调用valueChangeListener
。或者,当您已经在使用 JSF 2.x 时(请始终在 JSF 问题中提及确切的 JSF impl/版本),您可以为此使用 <f:ajax>
标签,而无需使用带有黑客onchange="submit()"
的valueChangeListener
。
其次,您需要确保数据表值#{someHandler.entities}
在提交期间返回与初始请求期间完全相同的列表。因此,在 bean(post)构造函数中进行数据加载。在 JSF 2.x 中,您还希望将 Bean 放在视图范围内。
与具体问题无关,您也可以只使用<h:selectOneMenu>
而不是<h:selectOneListbox size="1">
。