You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在EL中引用ui:repeat当前索引以关联aria-describedby

在PrimeFaces的<ui:repeat>中正确设置aria-describedby关联错误提示

问题分析

在<ui:repeat>动态生成输入字段时,直接使用pt:aria-describedby="personalForm:names:{index}:errName"无法生效——JSF的passthrough属性会把{index}当作纯字符串传递,不会解析为循环索引,导致无法关联到实际渲染的错误提示元素ID(比如personalForm:names:0:errName)。

解决方案

方法1:用EL表达式替换{index}

passthrough属性支持JSF表达式语言(EL),直接将{index}替换为#{index}即可让JSF解析循环索引,生成正确的ID路径:

<h:form id="personalForm">
    <div class="form-fields">
        <ui:repeat value="#{testView.list}" var="item" id="names">
            <div class="field-container">
                <span class="ui-float-label">
                    <p:inputText value="#{item.name}"
                                 pt:aria-describedby="personalForm:names:#{index}:errName">
                    </p:inputText>
                    <p:outputLabel for="@previous" value="Name" />
                </span>
            </div>
            <p:fragment id="errName">
                <small class="block ui-state-error">Username is not available.</small>
            </p:fragment>
        </ui:repeat>
    </div>
</h:form>

渲染后aria-describedby的值会自动替换为personalForm:names:0:errName、personalForm:names:1:errName等正确格式。

方法2:通过组件绑定动态获取客户端ID

如果不想硬编码表单和repeat的ID(避免结构变更后需要修改代码),可以给错误提示的<p:fragment>绑定一个EL变量,直接使用它的clientId属性:

<h:form id="personalForm">
    <div class="form-fields">
        <ui:repeat value="#{testView.list}" var="item" id="names">
            <div class="field-container">
                <span class="ui-float-label">
                    <p:inputText value="#{item.name}"
                                 pt:aria-describedby="#{errFragment.clientId}">
                    </p:inputText>
                    <p:outputLabel for="@previous" value="Name" />
                </span>
            </div>
            <p:fragment id="errName" binding="#{errFragment}">
                <small class="block ui-state-error">Username is not available.</small>
            </p:fragment>
        </ui:repeat>
    </div>
</h:form>

这种方式完全依赖JSF组件的客户端ID生成逻辑,无需手动拼接路径,灵活性更高。

方法3:利用PrimeFaces原生无障碍支持

PrimeFaces的<p:message>组件本身就支持自动关联输入框并处理无障碍属性,无需手动设置aria-describedby。将自定义的错误提示替换为<p:message>:

<h:form id="personalForm">
    <div class="form-fields">
        <ui:repeat value="#{testView.list}" var="item" id="names">
            <div class="field-container">
                <span class="ui-float-label">
                    <p:inputText value="#{item.name}" id="nameInput">
                    </p:inputText>
                    <p:outputLabel for="@previous" value="Name" />
                </span>
            </div>
            <p:message for="nameInput" id="errName" display="text" styleClass="block ui-state-error" />
        </ui:repeat>
    </div>
</h:form>

<p:message>会自动为输入框添加正确的aria-describedby属性,同时自带验证错误展示逻辑,适合结合PrimeFaces的验证框架使用。

内容的提问来源于stack exchange,提问作者yangsunny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 22:33:10