如何在 ui:repeat 中设置组件/标签的 id
我正在尝试将 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
对于诸如
之类的渲染时标记来说,这是不可能的。然而,
本身已经通过在生成的客户端 ID 前添加行索引来确保其唯一性。所以只要从组件的ID属性中去掉EL部分就可以了。使用视图构建时标签,例如
(基本上会生成多个
组件,而不是仅生成一个多次渲染的组件),可以指定这样的动态 ID。(您应该充分了解 JSTL 在 Facelets 中的工作原理)
另一种方法是使用静态
元素而不是 JSF
组件。另请参阅:
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.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.(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.See also:
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.