2014-04-26 33 views
2

我在pojo列表中有一個pojo列表,我試圖在jsf 2.2.6和primefaces 4.0的數據表中以動態方式使用pojo列表。我認爲我很接近,但是我一直無法完成工作。訪問p:datatable列表中的列表

這個想法是配置多輪高爾夫比賽。主要名單(註冊)是所有有名字,障礙因素等信息的球員。註冊名單內的名單是開球次數,開球次數等,每輪可以是1-4輪,我只想顯示一次一個在p:dataTable的列中。用戶將使用selectOneButton單擊他們想要查看的輪,並且它會動態更改爲該數據。

關鍵思想是(1)selectOneButton和ajax來觸發標識索引到表的屬性的更改。 (2)JSTL幫助使EL表達式變得更短並且更易讀(3)典型的數據表遍歷主表(4)EL把它放在一起,試圖根據按鈕選擇的索引提取右輪。 這是一個精簡版,以顯示問題,但我不認爲我已經遺漏了任何重要的東西。這裏是XHTML:

<c:set value="#{events.activeRoundIndex}" var="i"/> 

<p:commandButton value="Update" action="#{events.regUpdateAll()}" 
       process="@form" update="@form" /> 

<div style="float: right"> 
    <p:selectOneButton rendered="#{events.selectedEvent.noOfRounds gt 0}" value="#{events.activeRoundIndex}"> 
     <f:selectItem itemLabel="1" itemValue="0"/> 
     <f:selectItem itemDisabled="#{events.selectedEvent.noOfRounds lt 2}" itemLabel="2" itemValue="1"/> 
     <f:selectItem itemDisabled="#{events.selectedEvent.noOfRounds lt 3}" itemLabel="3" itemValue="2"/> 
     <f:selectItem itemDisabled="#{events.selectedEvent.noOfRounds lt 4}" itemLabel="4" itemValue="3"/> 
     <f:ajax execute="@form" render="@form"/> 
    </p:selectOneButton> 
</div> 
<p:dataTable value="#{events.registrationList}" var="item" rowIndexVar="rowIndex"> 
    <p:columnGroup type="header"> 
     <p:row> 
      <p:column headerText="First Name" rowspan="2"/> 
      <p:column headerText="Last Name" rowspan="2"/> 
      <p:column headerText="Round #{i+1}" colspan="2"/> 
     </p:row> 
     <p:row> 
      <p:column headerText="Tee Time"/> 
      <p:column headerText="Start Hole"/> 
     </p:row> 
    </p:columnGroup> 

    <p:column>#{item.playerId.firstName}</p:column> 
    <p:column>#{item.playerId.lastName}</p:column> 
    <p:column> 
     <p:inputText value="#{item.roundList.get(i).teeTime}"> 
      <f:convertDateTime type="time" timeStyle="short"/></p:inputText> 
    </p:column> 
    <p:column> 
     <p:inputText value="#{item.roundList.get(i).startingHole}"/> 
    </p:column> 
</p:dataTable> 

沒有崩潰,數據格式正確,只是沒有從正確的位置檢索

任何方向將不勝感激

BTW這個問題是重寫我無法找出格式化,以放置較小的代碼片段。

更新:已經在我的代碼的另一個領域證明了這個概念,並進一步診斷出這個問題。更新模型值階段(4)正在更新列表中的錯誤索引。即如果我正在查看洞1(索引0)並單擊孔2,它實際上會更新索引1處的屬性,而不是JSF階段4(莫哈拉)中的0。我認爲這可能只是由於上面顯示的代碼。任何人都可以看到我做錯了什麼,或者它是一個系統錯誤?

用一個完整而簡單的代碼示例演示問題的進一步更新。通過使P1可編輯和P2顯示,您可以看到該屬性在沒有用戶輸入的情況下被更改。我相信這是一個系統錯誤,但希望我錯了,因爲我真的需要這個工作。下面是代碼:

<p:panelGrid> 
     <p:row> 
      <p:column>Name</p:column> 
      <p:column>Selected Index</p:column> 
      <p:column>P1</p:column> 
      <p:column>P2</p:column> 
     </p:row> 

     <c:forEach items="#{test.list}" var="item2"> 
      <c:set value="#{test.getMinor(item2)}" var="sub"/> 
      <p:row> 
       <p:column>#{item2.name}</p:column> 
       <p:column>#{test.selectedIndex}</p:column> 
       <p:column><p:inputText value="#{sub.p1}"/></p:column> 
       <p:column>#{sub.p2}</p:column> 
      </p:row> 
     </c:forEach> 
    </p:panelGrid> 
</h:form> 

和SessionScoped JAVA代碼

public class Test { 

private List<ItemHolder> list; 
private int selectedIndex=0; 

public Test() { 
    list = new ArrayList(); 
    list.add(new ItemHolder()); 
} 

public void doNothingAjax() { 
} 

public Item getMinor(ItemHolder holder) { 
    return holder.getItems().get(selectedIndex); 
} 
//Getters & Setters 

public class ItemHolder { 

    private String name; 
    List<Item> items; 

    public ItemHolder() { 
     name = "Test"; 
     items = new ArrayList(); 
     items.add(new Item("index 0",0,0)); 
     items.add(new Item("index 1",1,1));    
    } 
    //getters and setters 

public class Item { 
    private String label; 
    private int p1; //property 1 
    private int p2; //property 2 

    public Item(String label, int p1, int p2) { 
     this.label = label; 
     this.p1 = p1; 
     this.p2 = p2; 
    } 

    //Getters and Setters 

任何幫助將不勝感激。如果這是一個系統錯誤,對於解決方法的任何建議也會有所幫助。我正在用盡想法。

謝謝,約翰

+0

在這個問題中''的代碼是否丟失? – Omar

+0

我不知道我做了什麼奧馬爾,但我有那裏的文字,但格式化搞砸了。我認爲修訂版本會更清晰。 – GolfAddict

+0

我遵循鏈接和你的建議,傾向於使用ui:組件,而不是使用jstl,這對現在我更瞭解它們是有道理的。感謝那!我不認爲他們是這個問題的原因,雖然......第一個例子只是使用p:dataTable,我沒有直接訪問屬性,沒有c:set。結果是一樣的。我後來建立了一個特定的視圖來解決這個問題,但我更喜歡不必爲了使UI工作而構建自定義結構。 – GolfAddict

回答

2

c:forEachc:set是造成你的問題。請參閱subject上的variousarticles。(見BalusC's comment

基本上,c:標籤不保存狀態(不JSF組件樹的一部分),是造成你注意什麼:

更新模型值階段(4)更新我的清單中有錯誤的索引。

我沒有檢查,但我打賭第4階段總是更新最後可用('次要')sub.p1。這是因爲在階段4運行時,sub(last'minor')是一個常量,因爲它在每個階段的狀態爲c:forEach,迭代沒有保存在組件樹中。

對此提出建議?

  • 請勿使用c:標籤。
  • 而不是c:forEach使用ui:repeat
  • 代替c:set,使用完整路徑#{item2.items.get(test.selectedIndex).p1}。 (可能需要重新構建底層數據結構)