Jsf 理解ui:重复客户端id和组件查找

Jsf 理解ui:重复客户端id和组件查找,jsf,jsf-2,mojarra,Jsf,Jsf 2,Mojarra,莫哈拉2.1 问题实际上是关于组件查找算法 我有以下ui重复: <h:form id="frm"> <ui:repeat id="repeater" value="#{bean.values}" var="v"> <h:panelGroup id="pg"> <!-- content --> <h:selectBooleanCheckbox id="cb" value=

莫哈拉2.1

问题实际上是关于组件查找算法

我有以下
ui重复

<h:form id="frm">

    <ui:repeat id="repeater" value="#{bean.values}" var="v">
        <h:panelGroup id="pg">
            <!-- content -->
            <h:selectBooleanCheckbox id="cb" value="#{bean.v}">
                <f:ajax event="change" listener="#{bean.listener()}" render=":frm:repeater:pg" />
           </h:selectBooleanCheckbox>
           <!-- another content -->
        </h:panelGroup>
    </ui:repeat>

</h:form>
现在,方法
component.findComponent(id)
返回具有
clientId
-
frm:repeater:0:pg
的组件。但是调用方法作为
component.findComponent(“:frm:repeater:0:pg”)
返回
null

为什么??我希望结果是一样的。我遗漏了什么?

这是根据Mojarra 2.2.5中的“修复”,他们只是完全删除了空检查,而不是通过剥离迭代索引来改进它。从那时起,可以指定任意的客户机ID,并且永远不会触发异常。我已经创建并提出了一个解决方案

因此,这意味着,自Mojarra 2.2.5以来,只要模型得到适当的保留(即,它是视图范围的),您就可以使用ajax更新特定的
迭代轮



但这也意味着,由于Mojarra 2.2.5,您将永远不会遇到众所周知的“包含未知id‘foo’无法在组件‘bar’的上下文中找到它”错误,这是令人困惑的,对初学者来说是不好的

另见:


与具体问题无关,在您的特定情况下,您也可以只执行
render=“pg”
而不是
render=“:frm:repeater:pg”
,因为呈现目标组件与执行源组件位于同一命名容器父组件中。

,在Mojarra 2.2.5之前,
组件.findComponent(:frm:repeater:pg)
返回与特定迭代项相关的组件,该迭代项由
组件
本身确定,对吗?这与Mojarra版本无关。错误异常只发生在2.2.5.Ah之前,现在我明白了,谢谢。在Mojarra 2.2.12中,我们只需首先检查指定的id是否为“全局id”。如果是,则返回
id.substring(1)
。如果没有,那么只返回id。我认为它是按照您在评论中提到的那样实现的,我们也可以改进findComponent()规范和算法,以覆盖迭代索引。
private static String getResolvedId(UIComponent component, String id) {

        UIComponent resolvedComponent = component.findComponent(id);
        if (resolvedComponent == null) {
            // RELEASE_PENDING  i18n
            throw new FacesException(
                "<f:ajax> contains an unknown id '"
                + id
                + "' - cannot locate it in the context of the component "+component.getId());
        }

        return resolvedComponent.getClientId();
    }
component = the instance of the HtmlSelectBooleanCheckbox
id = :frm:repeater:pg
<h:form id="form">
    <ui:repeat id="list" value="#{['one','two','three']}" var="item">
        <h:outputText id="item" value="#{item}" /><br/>
    </ui:repeat>

    <h:commandButton value="Update second item">
        <f:ajax render=":form:list:1:item" />
    </h:commandButton>
</h:form>