component.namingContainer.parent跳过h:form

时间:2012-12-30 17:48:47

标签: ajax jsf-2 composite-component naming-containers

我制作了一个复合组件,里面是< f:ajax> tag,其“render”属性是cc的参数。

类似的东西:

    ...
    <cc:attribute name="additionalAjaxRenderIds" type="java.lang.String"></cc:attribute>
    ...
    <h:commandLink value="test" action="#{myBean.someAction}" id="testLink" >
        <f:ajax execute="@this" render="#{cc.attrs.additionalAjaxRenderIds} "/>
    </h:commandLink>
    ...

我在表单中使用此cc,已经在外部命名容器中:

    <h:form id="myForm">
        ...
        <mycomp:myComponent id="myCC" additionalAjaxRenderIds=":#{component.namingContainer.parent.clientId}:myPanel" />
        <h:panelGroup id="myPanel">
            ...
        </h:panelGroup>
        ...
    </h:form>

问题是,如果我写

additionalAjaxRenderIds=":#{component.namingContainer.clientId}:myPanel"

我收到此错误:

<f:ajax> contains an unknown id ':j_idt44:myForm:myCC:myPanel' - cannot locate it in the context of the component testLink

如果我使用此(+ .parent):

additionalAjaxRenderIds=":#{component.namingContainer.parent.clientId}:myPanel"

错误是:

<f:ajax> contains an unknown id ':j_idt44:myPanel' - cannot locate it in the context of the component testLink

而不是预期的ID:

':j_idt44:myForm:myPanel'

所以看起来我cc的命名容器的父级不是表单,而是外部命名容器

有没有办法: 1,获得正确的父母(表格) 2,在我将它作为参数传递之前评估EL(因此我可以将计算出的clientId传递给我的cc而不是EL表达式,因此组件不会引用commandLink标签,而是引用我放入我的h:form cc)的

我知道我可以使用

additionalAjaxRenderIds=":#{component.namingContainer.parent.clientId}:myForm:myPanel" 

但我不喜欢那个解决方案

此外,将表单的prependId属性设置为false会破坏整个组件查找(以及结果也是ajax标记)

1 个答案:

答案 0 :(得分:0)

在构建组件时不会评估EL表达式,但是在访问该属性时。换句话说,它们是运行时而不是构建时间#{component}在评估EL表达式时引用当前 UI组件,在您的特定情况下为<h:commandLink>。这解释了不同的结果。

您需要以不同方式处理此问题,而不使用#{component}

E.g。

<h:form id="myForm" binding="#{myForm}">
    ...
    <mycomp:myComponent id="myCC" additionalAjaxRenderIds=":#{myForm.clientId}:myPanel" />
    <h:panelGroup id="myPanel">
        ...
    </h:panelGroup>
    ...
</h:form>

<h:form id="myForm">
    ...
    <mycomp:myComponent id="myCC" additionalAjaxRenderIds=":#{myPanel.clientId}" />
    <h:panelGroup id="myPanel" binding="#{myPanel}">
        ...
    </h:panelGroup>
    ...
</h:form>