我有一个dataTable列出了一些对象,我想使用selectOneListbox为这些对象设置属性。这是我的dataTable
<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位于哪一行。(它似乎总是第一行中的记录器)。我得到的Logger对象也不是我想要的。
有什么想法吗?谢谢!
还有其他问题吗?即使我有valueChangeListener,是否调用了entitiy.setLevel()方法?我使用entitiy.level,因为我想将所选级别显示为这些实体的默认级别。
谢谢!
答案 0 :(得分:3)
这里有两个潜在的问题:
首先,onchange="submit()"
提交整个表单。将在所有输入元素上调用valueChangeListener
,提交的值与初始值不同。
您需要使用与默认菜单选项相同的值预设#{entitiy.level}
后面的值。例如。在构造函数中。
public Entity() {
level = "-";
}
或者,更好的是,设置默认值null
。
<f:selectItem itemValue="#{null}" itemLabel="-" />
以便在未更改特定菜单时不会调用valueChangeListener
。
或者,当您已经使用JSF 2.x时(请始终在JSF问题中提及确切的JSF impl / version),您可以使用<f:ajax>
标记,而无需使用valueChangeListener
有一个hacky onchange="submit()"
。
其次,您需要确保数据表值#{someHandler.entities}
在提交期间返回完全相同的列表,就像在初始请求期间一样。所以,在bean(post)构造函数中加载数据。在JSF 2.x中,您也希望将bean放在视图范围内。
无关,您也可以使用<h:selectOneMenu>
代替<h:selectOneListbox size="1">
。