使用selectOneListbox的JSF dataTable

时间:2011-05-10 15:30:31

标签: jsf datatable

我有一个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,因为我想将所选级别显示为这些实体的默认级别。

谢谢!

1 个答案:

答案 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">