JSF 数据表与选择一列表框



我有一个列出一些对象的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">

相关内容

  • 没有找到相关文章