2011-11-20 72 views
0

我需要顯示拍賣物品的清單。當用戶點擊每個項目旁邊的「出價」按鈕時,我想讓ajax在此拍賣項目下打開出價表單。所以我打算使用ui:repeatf:ajax(如下所示),但是當我進入頁面時,所有拍賣項目都在其旁邊打開了投標組件。點擊任何按鈕都不會執行任何操作。這是代碼(與投標書格式簡化到只是一個outputText:f:ajax在ui裏面:重複

<h:form> 
<table border="1"> 
<ui:repeat var="parcel" varStatus="status" value="#{auctionsViewBean.parcels}"> 
<tr> 
    <td><h:commandButton value="Bid" action="nothing"> 
     <f:ajax render="bidView"/> 
    </h:commandButton></td> 
    <td>#{status.index + 1}</td> 
    <td>#{parcel.a}</td> 
    <td>#{parcel.b}</td> 
    <td>#{parcel.c}</td> 
</tr>  
<tr><td><h:outputText id="bidView" value="#{auctionsViewBean.showBidViewForParcel(parcel)}">Some text</h:outputText></td></tr> 

</ui:repeat> 
</table> 
</h:form> 

我在做什麼錯?我怎樣才能指定與點擊拍賣項目相關的投標組件?

回答

2

如果我理解正確,您想要初始隱藏bidView,直到按下按鈕?您可以通過給它一個rendered屬性並將其放入另一個可由<f:ajax>引用的組件中。您只需重新排列操作方法和檢查邏輯。

<h:commandButton value="Bid" action="#{auctionsViewBean.addBidView(parcel)}"> 
<f:ajax render="bidView" /> 
... 
<h:panelGroup id="bidView"> 
    <h:panelGroup rendered="#{auctionsViewBean.showBidView(parcel)}"> 
     ... 
    </h:panelGroup> 
</h:panelGroup> 

像這樣的東西:

public void addBidView(Parcel parcel) { 
    bidViews.put(parcel, new BidView()); 
} 

public boolean isShowBidView(Parcel parcel) { 
    return bidViews.containsKey(parcel); 
} 
+0

感謝您的回覆,BalusC。其實我沒有嵌套的形式,我說上面的代碼只是簡化了,因爲我刪除了表中的一些​​元素。簡而言之,如果我可以使這個代碼在上面工作,我會很好。所以我猜這個問題是:如何讓頁面在第一次呈現時不會出現在「bidView」元素中,並且只有在點擊後纔會出現點擊拍賣? (這是一個總的新手問題,我敢肯定我錯過了一些簡單的東西。) – Herzog

+0

啊對了。你的問題始終是模棱兩可的,你的錯誤嘗試已經使我錯誤地理解你真正需要的東西(基本上,我知道你的情況下''沒有做任何事情 - 這是不真實的)。我更新了答案。 – BalusC

+0

非常感謝您抽出時間,BalusC。它現在起作用,但只是部分。當我進入頁面時,組件被隱藏起來。當我點擊按鈕時,顯示正確的一個。到現在爲止還挺好。但似乎isShowBidView正在爲循環的每次迭代調用 - 直到我點擊按鈕的行。因此,例如,如果有4行,並且我點擊第三行旁邊的按鈕,則會調用第一行,第二行和第三行的isShowBidView。前兩項正確的錯誤,第三項正確的錯誤。這是怎麼回事? – Herzog