【问题标题】:Can't dynamically set component identifier无法动态设置组件标识符
【发布时间】:2013-08-06 12:49:09
【问题描述】:

我在 dataTable 中有一个 p:inputText 字段,我正在尝试动态设置它的标识符。

但是我收到以下错误:

组件标识符不能是零长度字符串

用作 id 的字符串都不是 null 或零长度

<h:form id="updateform">
            <p:dataTable id="updatetable" value="#{EditingBean.row}" var="column"
                                 style="width: 983px; overflow-x: auto; white-space: normal;">
                <f:facet name="header">
                    <h:outputText value="#{EditingBean.currentStatement.statementName}" />
                </f:facet>
                <p:column rendered="#{column.display}" style="white-space: normal;">
                    <h:outputText value="#{column.alias}" />
                </p:column>
                <p:column rendered="#{column.display}" style="white-space: normal;">
                    <p:inputText id="#{column.name}" value="#{column.value}" />
                </p:column>
                <f:facet name="footer" style="text-align: right;">
                    <h:commandButton value="Update" action="#{EditingBean.update()}"
                        ajax="false" />
                </f:facet>
            </p:dataTable>
        </h:form>

【问题讨论】:

  • 再次检查#{EditingBean.row} 对象中每个对象的#{colum.name} 值。如果一个 name 属性是 null 或 ""(一个空字符串),你会得到错误。
  • 我有,绝对没有一个是 null 或 ""。
  • 这里是值:mep_ident、mep_ptrpartident、mep_ptrpassident、mep_code_doc、mep_production

标签: jsf-2 primefaces identifier


【解决方案1】:

id 属性必须在视图构建时设置。

但是,由于 #{column} 被声明为 &lt;h:dataTable var&gt;,它仅在视图渲染期间可用。由于它在视图构建时间之后运行,因此它在视图构建时间期间为 null

我不确定您认为这样做是正确解决方案的具体功能要求。该代码没有足够的自我记录来正确猜测它。所以很难给出一个合适的答案。无论如何,您基本上有两种选择:

  1. 使用在视图构建期间运行的迭代标记,例如 JSTL &lt;c:forEach&gt;

    <c:forEach items="#{EditingBean.row}" var="column">
        ...
        <p:inputText id="#{column.name}" ... />
    
  2. 您实际上可能根本不需要动态 ID。给它一个固定的ID。

    <p:inputText id="name" ... />
    

    JSF 已经负责在 HTML 输出中生成唯一 ID(以行索引为前缀)。右键单击页面并执行查看源代码以自己查看。

另见:

【讨论】:

  • 我需要使用名称来验证输入,因为我事先不知道输入应该是什么类型。
  • 只需在 styleClass 上设置一个 CSS 类,例如 styleClass="phone"styleClass="url"styleClass="email" 等。无论如何,这些输入不可能是唯一的,因此您的 id 方法可以实现第一名已经毫无意义。使用 jQuery,您可以轻松获取它们,如 $(".phone")$(".email") 等。
  • 一列通常不止一行,对吧?因此,您最终在一列中的输入与行数一样多,对吗?因此,例如10 行你最终有 10 个电话输入等。
  • 没关系。这仍然不意味着这些输入在 HTML 上下文中是唯一的。它们仍然有多个,只是有条件地显示/隐藏。因此,CSS 类是正确且最简单的解决方案。
  • 我的问题是我需要在验证时访问该字段(我正在使用&lt;f:event type="postValidate" listener="#{EditingBean.validate}" /&gt;)是否可以通过 StyleClass 访问组件,就像通过 id 一样?
猜你喜欢
  • 1970-01-01
  • 2011-11-10
  • 2021-12-19
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
相关资源
最近更新 更多