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



我正试图将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中已经不存在了。

相关内容

  • 没有找到相关文章

最新更新