2012-07-11 52 views
1

,以基於項目集合創建面板。所有這些都改變了,現在我必須使用c:forEach來代替。 在每個面板上,我會進行大量的AJAX調用和部分頁面更新。這就是爲什麼我使用自定義ID來識別我想更新的組件。所以,我的渲染屬性是這樣的:在我使用渲染時間標記(如a4j:repeat,ui:repeat)之前,在c:for each標記中添加循環索引

#{cc.clientId}:pnlRepeat:#{row}:radioAplicar 

哪裏pnlRepeat是id屬性,{} #row在同一標籤的rowKeyVar屬性。現在...當使用c:forEach時,它們都不存在,因此,我得到了重複的id異常。我知道我可以使用varStatus,並使用#{row} ID創建面板,但是另一方面。 JSF不允許id屬性來評估EL表達式。什麼是解決方法?非常感謝。

回答

2

您不應該試圖將您的ManagedBean邏輯或EL表達式作爲生成的重複組件的ID(例如<ui:repeat><c:forEach>)的基礎。就像你已經提到過的那樣,EL表達式不會讓你動態地評估一個Id表達式,所以處理這種情況的恰當方法是在一個重複組件中的一個單獨的項目觸發一個事件,就是傳遞一個唯一標識值<f:attribute>標籤。

使用<f:attribute>標記將指定的值放入請求屬性中,以便它可以在您的動作偵聽器中檢索。

<ui:repeat value="..." var="repeatedVar"> 
    <h:inputText id="newTxt" value="#{repeatedVar}" > 
    <f:attribute name="unique_id" value="#{repeatedVar.uniqueId}" /> 
    </h:inputText> 
</ui:repeat> 
<h:commandButton actionListener="#{managedBean.someMethod}" ... 

而且在動作方法,我們可以判斷的動作或商業邏輯是通過檢索動態組件屬性被執行什麼。

public void someMethod() { 
    String uniqueId = (String) UIComponent.getCurrentComponent(FacesContext.getCurrentInstance()).getAttributes().get("unique_id"); 
    //Get the unique data object 
    //Do some business logic and other stuff... 
}