我正试图将id
分配给<ui:repeat>
内部的组件,如下所示:
<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.IollegalArgumentException:组件标识符不能是长度为零的字符串在
有什么想法吗?
对于<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}">
另请参阅:
- JSF2 Facelets中的JSTL。。。有道理吗
JSF会自动为id添加前缀。如果你只写id="column",生成的HTML将包含这样的标识符:
myForm:0:列myForm:1:列myForm:2:列
等等
无论如何:永远不要在JSF模板中使用JSTL标记(比如c:foreach和c:if)。它们会导致随机行为,很难调试。如果它们起作用,就会大大降低应用程序的速度。
对循环使用ui:repeat,对条件块使用ui:frage。请注意,c:set没有替代品,这样的构造在JSF 2中已经不存在了。