【问题标题】:How can I set id of a component/tag inside ui:repeat如何在 ui:repeat 中设置组件/标签的 id
【发布时间】:2020-05-13 09:41:10
【问题描述】:

我正在尝试将 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.IllegalArgumentException:组件标识符不能是零长度字符串 在

有什么想法吗?

【问题讨论】:

    标签: jsf jsf-2 facelets uirepeat


    【解决方案1】:

    这对于诸如&lt;ui:repeat&gt; 之类的渲染时标签是不可能的。但是,&lt;ui:repeat&gt; 本身已经通过在其前面加上行索引来确保生成的客户端 ID 的唯一性。所以只需从组件的 ID 属性中删除 EL 部分即可。

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

    使用诸如&lt;c:forEach&gt; 之类的视图构建时间标记(基本上会生成多个&lt;h:panelGroup&gt; 组件,而不是只生成一个多次呈现的组件),可以指定这样的动态ID。

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

    (您应该只是 well aware 了解 JSTL 在 Facelets 中的工作方式)

    另一种方法是使用静态&lt;div&gt; 元素而不是JSF &lt;h:panelGroup layout="block"&gt; 组件。

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

    另见:

    【讨论】:

    • 谢谢,我最终用 div 做到了。所以这意味着我不能自己为 ui:repeat 中的 JSF 元素分配动态 ID?仅适用于简单的 HTML 元素
    • 没错。渲染时 ID 不能在组件树中注册,它必须是固定值而不是动态值。无论您想通过这样的方式解决什么功能需求,它都不是“JSF 式”的方式,您可能需要三思而后行以避免将来出现意外。
    【解决方案2】:

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

    myForm:0:column 我的表格:1:列 myForm:2:列

    等等。

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

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

    【讨论】:

    • 工作就像一个魅力,这是一个很好的解释。我也想知道为什么它被否决了,但我会投赞成票,因为它很有意义。
    • Downvote 是因为“无论如何:不要在 JSF 模板中使用 JSTL 标签(如 c:foreach 和 c:if)。它们会导致随机行为,非常难以调试。如果它们有效,那么大大降低了应用程序的速度。”这根本不是真的
    • +1 与上述评论的原因相反。例如c:foreach、unline ui:repeat,是在编译时,并且不会随 ajax 请求更新。
    猜你喜欢
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多