12

我正在尝试将一个分配给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属性内。属性内设置的所有内容都是由 JSF + 我的硬编码值id自动生成的。idcolumn_

如果我删除硬编码column_,我会得到一个异常:

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

有任何想法吗?

4

2 回答 2

15

这对于诸如<ui:repeat>. 然而<ui:repeat>,将通过在生成的客户端 ID 前面加上行索引来确保生成的客户端 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}">

也可以看看:

于 2012-02-05T11:07:56.540 回答
8

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 中不再存在。

于 2012-11-21T18:52:11.293 回答