2011-05-10 73 views
2

我有一个dataTable列出了一些对象,我想为使用selectOneListbox的对象设置一个属性。这是我的dataTableJSF 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)); 
} 

然而,事件对象始终是相同的 - 不管哪一行(数据表上的HtmlDataTable对象。) selectOneListbox在。(它似乎总是第一行的记录器)。我得到的Logger对象也不是我想要的。

任何想法?谢谢!

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

谢谢!

回答

3

这里有两个潜在的问题:


首先,onchange="submit()"提交整个形式。 valueChangeListener将被调用全部输入元素其中提交的值不同于初始值的值。

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

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

或者,更好,使默认值null

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

这样valueChangeListener不会在特定菜单没有改变时被调用。

或者,当你已经在JSF 2.x的(请务必注明您的JSF问题,确切的JSF IMPL /版),你可以使用这个<f:ajax>标签,而不需要一个valueChangeListener与哈克onchange="submit()"


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


无关到具体的问题,您也可以只使用<h:selectOneMenu>代替<h:selectOneListbox size="1">

+0

非常感谢BalusC,我已经从你身上学到了很多东西!但是有一个问题:实际上我想通过调用某个第三方类来获得具有值的entity.level预设值。每行都应该显示当前级别(这就是为什么我不想在每一行显示“ - ”)并且如果我更改该列表框的值,该级别应该改变(仅针对该行)。我会看看我能用ajax做些什么。 – geeehhdaa 2011-05-11 15:54:14

+0

不客气。 – BalusC 2011-05-11 15:55:42