如何在ui:repeat中设置组件/标签的id

时间:2012-02-05 07:46:50

标签: jsf-2 facelets

我正在尝试在ui:repeat

中为h:panelGroup分配一个id 像那样

<ui:repeat value="#{dashboardPage.dashboardModel.columns}" var="column">
    <h:panelGroup layout="block" styleClass="#{column.id} dashboard_column" id="column_#{column.id}">

问题是#{column.id}值正在styleClass值中正确放置但是它没有在id属性中设置所有在id属性中设置的是由JSF自动生成的id +我的硬编码值“column _”

如果我删除硬编码的“column_”,我会得到一个例外

  

java.lang.IllegalArgumentException:组件标识符不能是零长度String   在

任何想法?

2 个答案:

答案 0 :(得分:12)

使用<ui:repeat>之类的渲染时标记无法做到这一点。然而,<ui:repeat>本身已经通过在行索引前加上它来确保生成的客户机ID的唯一性。所以只需从组件的ID属性中删除EL部分。

使用视图构建时间标记(例如<c:forEach>(基本上将生成多个<h:panelGroup>组件而不是仅多次呈现的组件),可以指定类似的动态ID。

<c:forEach items="#{dashboardPage.dashboardModel.columns}" var="column">
    <h:panelGroup layout="block" styleClass="#{column.id} dashboard_column" id="column_#{column.id}">

(你应该只是JSTL在Facelets中工作方式的well aware

另一种方法是使用静态<div>元素而不是JSF <h:panelGroup layout="block">组件。

<ui:repeat value="#{dashboardPage.dashboardModel.columns}" var="column">
    <div class="#{column.id} dashboard_column" id="column_#{column.id}">

答案 1 :(得分:6)

JSF会自动为id添加前缀。如果你只是写id =&#34; column&#34;生成的HTML将包含这样的标识符:

myForm会:0:柱 myForm的:1:柱 myForm会:2:柱

等等。

无论如何:永远不要在JSF模板中使用JSTL标记(如c:foreach和c:if)。它们会导致随机行为,很难调试。如果它们有效,那么应用程序就会慢下来。

使用ui:repeat for循环,ui:fragment用于条件块。请注意,c:set没有替换,这样的构造在JSF 2中不再存在。