[英]How can I set id of a component/tag inside ui:repeat
我正在嘗試為<ui:repeat>
的組件分配一個id
,如下所示:
<ui:repeat value="#{bean.columns}" var="column">
<h:panelGroup layout="block" id="column_#{column.id}"
styleClass="#{column.id} dashboard_column">
問題是#{column.id}
值被正確放置在styleClass
值中,但未在id
屬性中設置。 在id
屬性中設置的所有內容都是 JSF 自動生成的id
+ 我的硬編碼值column_
。
如果我刪除硬編碼column_
我得到一個例外:
java.lang.IllegalArgumentException:組件標識符不能是零長度字符串
有任何想法嗎?
這對於諸如<ui:repeat>
類的渲染時間標記是不可能的。 但是<ui:repeat>
本身已經通過在其前面加上行索引來確保生成的客戶端 ID 的唯一性。 所以只需從組件的 ID 屬性中刪除 EL 部分。
<ui:repeat value="#{bean.columns}" var="column">
<h:panelGroup layout="block" id="column">
使用諸如<c:forEach>
類的視圖構建時間標記(它基本上會生成多個<h:panelGroup>
組件,而不是只生成多次渲染的組件),可以像這樣指定動態 ID。
<c:forEach items="#{bean.columns}" var="column">
<h:panelGroup layout="block" id="column_#{column.id}">
(您應該只清楚JSTL 在 Facelets 中的工作方式)
另一種方法是使用靜態<div>
元素而不是 JSF <h:panelGroup layout="block">
組件。
<ui:repeat value="#{bean.columns}" var="column">
<div id="column_#{column.id}">
JSF 自動為 id 加上前綴。 如果你簡單地寫 id="column" 生成的 HTML 將包含這樣的標識符:
myForm:0:column myForm:1:column myForm:2:column
等等。
無論如何:永遠不要在 JSF 模板中使用 JSTL 標記(如 c:foreach 和 c:if)。 它們會導致隨機行為,非常難以調試。 如果它們有效,應用程序的速度會大大減慢。
對循環使用 ui:repeat,對條件塊使用 ui:fragment。 請注意,c:set 沒有替代品,這樣的構造在 JSF 2 中不再存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.