【问题标题】:JSF dataTable with selectOneListbox带有 selectOneListbox 的 JSF 数据表
【发布时间】:2011-05-10 15:30:31
【问题描述】:

我有一个列出一些对象的数据表,我想使用 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 在哪一行。(似乎总是第一行中的记录器)。我得到的 Logger 对象也不是我想要的。

有什么想法吗?谢谢!

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

谢谢!

【问题讨论】:

    标签: jsf datatable


    【解决方案1】:

    这里有两个潜在的问题:


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

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

    public Entity() {
        level = "-";
    }
    

    或者,最好设置默认值null

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

    以便在特定菜单未更改时不会调用valueChangeListener

    或者,当您已经使用 JSF 2.x 时(请始终在您的 JSF 问题中提及确切的 JSF impl/version),您可以为此使用 &lt;f:ajax&gt; 标签,而无需 valueChangeListener 和 hacky @ 987654330@.


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


    与具体问题无关,您也可以只使用&lt;h:selectOneMenu&gt; 而不是&lt;h:selectOneListbox size="1"&gt;

    【讨论】:

    • 非常感谢BalusC,我已经从你身上学到了很多!但是有一个问题:实际上我希望 entity.level 预设一个我通过调用某个第三方类获得的值。每行都应该显示当前级别(这就是我不想在每一行中显示“-”的原因),如果我更改该列表框的值,级别应该更改(仅针对该行)。我会看看我能用 ajax 做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-21
    相关资源
    最近更新 更多