2011-05-10 64 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