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

发布于 2025-01-02 04:26:57 字数 636 浏览 1 评论 0原文

我正在尝试将 id 分配给 内的组件,如下所示:

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

问题是 #{column.id}< /code> 值已正确放置在 styleClass 值内,但未在 id 属性内设置。 id 属性内设置的所有内容都是由 JSF 自动生成的 id + 我的硬编码值 column_

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

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

什么想法吗?

I'm trying to assign an id to a component inside a <ui:repeat> like that:

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

The thing is that #{column.id} value is being placed properly inside the styleClass value but its not being set inside the id attribute. All that is being set inside the id attribute is the automatically generated id by the JSF + my hard coded value column_.

If I remove the hard coded column_ I get an exception:

java.lang.IllegalArgumentException: component identifier must not be a zero-length String
at

Any Ideas?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

平安喜乐 2025-01-09 04:26:57

对于诸如 之类的渲染时标记来说,这是不可能的。然而, 本身已经通过在生成的客户端 ID 前添加行索引来确保其唯一性。所以只要从组件的ID属性中去掉EL部分就可以了。

<ui:repeat value="#{bean.columns}" var="column">
    <h:panelGroup layout="block" id="column">

使用视图构建时标签,例如 (基本上会生成多个 组件,而不是仅生成一个多次渲染的组件),可以指定这样的动态 ID。

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

(您应该充分了解 JSTL 在 Facelets 中的工作原理)

另一种方法是使用静态

元素而不是 JSF 组件。

<ui:repeat value="#{bean.columns}" var="column">
    <div id="column_#{column.id}">

另请参阅:

This is not possible with a render-time tag such as <ui:repeat>. The <ui:repeat> will however by itself already ensure the uniqueness of the generated client ID by prepending it with the row index. So just remove the EL part from the ID attribute of the component.

<ui:repeat value="#{bean.columns}" var="column">
    <h:panelGroup layout="block" id="column">

With a view build time tag such as <c:forEach> (which will basically generate multiple <h:panelGroup> components instead of only one which is rendered multiple times), it is possible to specify a dynamic ID like that.

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

(you should only be well aware of how JSTL works in Facelets)

An alternative is to use a static <div> element instead of a JSF <h:panelGroup layout="block"> component.

<ui:repeat value="#{bean.columns}" var="column">
    <div id="column_#{column.id}">

See also:

千笙结 2025-01-09 04:26:57

JSF 自动为 id 添加前缀。如果你简单地写 id="column" 生成的 HTML 将包含这样的标识符:

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

等等。

无论如何:永远不要在 JSF 模板中使用 JSTL 标记(例如 c:foreach 和 c:if)。它们会导致随机行为,非常难以调试。如果它们起作用,应用程序的速度就会大大减慢。

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

JSF prefixes the id automatically. If you simply write id="column" the generated HTML will contain such identifiers:

myForm:0:column
myForm:1:column
myForm:2:column

and so on.

Anyway: Do never use JSTL tags (like c:foreach and c:if) in JSF templates. They cause random behaviour, very difficult to debug. And if they work, the slow down the application a lot.

Use ui:repeat for loops, and ui:fragment for conditional blocks. Note that there is no replacement for c:set, such a construct does not exist anymore in JSF 2.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文