Jsf 如何在ui:repeat中设置组件/标记的id
我试图将Jsf 如何在ui:repeat中设置组件/标记的id,jsf,jsf-2,facelets,uirepeat,Jsf,Jsf 2,Facelets,Uirepeat,我试图将id分配给中的组件,如下所示: <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属性中
id
分配给
中的组件,如下所示:
<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+my硬编码值列自动生成的id
如果我删除硬编码的列
我会得到一个异常:
java.lang.IllegalArgumentException:组件标识符不能是零长度字符串
在
有什么想法吗?对于渲染时间标记(如
),这是不可能的。然而,
本身已经通过在生成的客户机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}">
另见:
JSF会自动为id添加前缀。如果只写id=“column”,生成的HTML将包含以下标识符:
myForm:0:列
myForm:1:列
myForm:2:列
等等
无论如何:不要在JSF模板中使用JSTL标记(比如c:foreach和c:if)。它们会导致随机行为,很难调试。如果它们能工作,应用程序的速度就会大大降低
对循环使用ui:repeat,对条件块使用ui:fragment。注意,c:set没有替代品,这样的构造在JSF2中已经不存在了。谢谢,我最终使用了div。这意味着我不能在ui中为JSF元素分配动态ID:自己重复?仅适用于正确的简单HTML元素。无法在组件树中注册渲染时ID,它必须是固定值而不是动态值。无论您想通过这样的方式来解决什么功能需求,这都不是“JSF-ish”的方式,您可能需要三思而后行,以避免将来的意外。它非常有魅力,这是一个很好的解释。我还想知道为什么它会有一个向下投票,但我会向上投票,因为它很有意义。向下投票是因为“无论如何:不要在JSF模板中使用JSTL标记(如c:foreach和c:if)。它们会导致随机行为,很难调试。如果它们工作,应用程序的速度会降低很多。”这根本不是真的