我在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
任何幫助將不勝感激。如果這是一個系統錯誤,對於解決方法的任何建議也會有所幫助。我正在用盡想法。
謝謝,約翰
在這個問題中''的代碼是否丟失? –
Omar
我不知道我做了什麼奧馬爾,但我有那裏的文字,但格式化搞砸了。我認爲修訂版本會更清晰。 – GolfAddict
我遵循鏈接和你的建議,傾向於使用ui:組件,而不是使用jstl,這對現在我更瞭解它們是有道理的。感謝那!我不認爲他們是這個問題的原因,雖然......第一個例子只是使用p:dataTable,我沒有直接訪問屬性,沒有c:set。結果是一樣的。我後來建立了一個特定的視圖來解決這個問題,但我更喜歡不必爲了使UI工作而構建自定義結構。 – GolfAddict