簡體   English   中英

如何在 ui:repeat 中設置組件/標簽的 id

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM