带有selectOneListbox的JSF数据表

带有selectOneListbox的JSF数据表,jsf,datatable,Jsf,Datatable,我有一个列出一些对象的数据表,我想使用selectOneListbox为这些对象设置一个属性。这是我的数据表 <h:dataTable value="#{someHandler.entities}" binding="#{someHandler.dataTable}" var="entitiy"> <h:column> <f:facet name="header"&

我有一个列出一些对象的数据表,我想使用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>
(dataTable是一个HtmlDataTable对象。)

但是,无论selectOneListbox位于哪一行,事件对象始终是相同的。(似乎总是第一行的记录器)。我得到的记录器对象也不是我想要的

有什么想法吗?谢谢大家!

还有其他问题吗?即使我有一个valueChangeListener,是否仍调用entitiy.setLevel()方法?我使用entitiy.level是因为我想将所选级别显示为这些实体的默认级别


谢谢大家!

这里有两个潜在问题:


首先,
onchange=“submit()”
提交整个表单。
valueChangeListener
将在提交值与初始值不同的所有
输入元素上调用

您需要使用与默认菜单选项相同的值预设
{entitiy.level}
后面的值。例如,在构造函数中

public Entity() {
    level = "-";
}
或者,最好将默认值
null

<f:selectItem itemValue="#{null}" itemLabel="-" />

这样,当特定菜单未更改时,将不会调用
valueChangeListener

或者,当您已经在使用JSF 2.x时(请在JSF问题中始终提到确切的JSF impl/版本),您可以使用
标记,而无需使用带有hacky
onchange=“submit()”
valueChangeListener


其次,您需要确保datatable值
{someHandler.entities}
在提交期间返回的列表与初始请求期间的列表完全相同。因此,在bean(post)构造函数中加载数据。在JSF2.x中,您还希望将bean放在视图范围中



与具体问题无关,您也可以使用
而不是

谢谢您,巴卢斯克,我已经从您那里学到了很多!但有一个问题:实际上,我希望使用通过调用某个第三方类获得的值预设entity.level。每一行都应该显示当前级别(这就是为什么我不想在每一行中显示“-”),如果我更改该列表框的值,级别应该更改(仅针对该行)。我将看看我能用ajax做些什么。
<f:selectItem itemValue="#{null}" itemLabel="-" />