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

Dan*_*iel 9 jsf facelets jsf-2 uirepeat

我正在尝试为一个id分配一个id:在ui中的panelGroup:repeat

像那样

<ui:repeat value="#{bean.columns}" var="column">
    <h:panelGroup layout="block" id="column_#{column.id}" 
        styleClass="#{column.id} dashboard_column">
Run Code Online (Sandbox Code Playgroud)

问题是,id值正在styleClass值中正确放置,但它没有在id属性中设置,所有在id属性中设置的都是由JSF +我的硬编码值"column_"自动生成的id.

如果我删除硬编码"column_"我得到一个例外

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

有任何想法吗?

Bal*_*usC 13

使用诸如的渲染时标记是不可能的<ui:repeat>.该<ui:repeat>但是本身并通过与行索引前面加上已经保证生成的客户端ID的唯一性.因此,只需从组件的ID属性中删除EL部分即可.

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

<ui:repeat value="#{bean.columns}" var="column">
    <h:panelGroup layout="block" id="column">
Run Code Online (Sandbox Code Playgroud)

(你应该只清楚 JSTL在Facelets中的工作原理)

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

<c:forEach items="#{bean.columns}" var="column">
    <h:panelGroup layout="block" id="column_#{column.id}">
Run Code Online (Sandbox Code Playgroud)


小智 6

JSF自动为id添加前缀.如果你只是写id ="column",生成的HTML将包含这样的标识符:

myForm:0:列myForm:1:列myForm:2:列

等等.

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

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