【问题标题】:component.namingContainer.parent skips h:formcomponent.namingContainer.parent 跳过 h:form
【发布时间】:2012-12-15 02:35:07
【问题描述】:

我做了一个复合组件,里面是一个标签,它的“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作为参数传递之前评估EL(所以我可以将计算出的clientId传递给我的cc而不是EL表达式,因此组件不会引用commandLink标签,而是引用我放置我的h:form cc)

我知道我可以使用

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

但我不喜欢那个解决方案

另外,将表单的 prependId 属性设置为 false 会破坏整个组件的查找(因此也会破坏 ajax 标签)

【问题讨论】:

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


    【解决方案1】:

    EL 表达式不会在构建组件时计算,而是在访问属性时计算。换句话说,它们是runtime 而不是buildtime#{component} 指的是评估 EL 表达式时的 当前 UI 组件,在您的特定情况下是 &lt;h:commandLink&gt;。这就解释了不同的结果。

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

    例如

    <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>
    

    【讨论】:

    • #{component} 是指评估 EL 表达式时的当前 UI 组件,在您的特定情况下是 - 我知道那,我的问题是,当我使用 #{component.namingContainer .parent } 而不是 #{component.namingContainer} 时,它似乎在层次结构中跳了两个级别,而不是 1 (该命名容器的父级,在这种情况下是 myCC,在我的理解中应该是 myForm)——除了你的解决方案有效,所以我稍后会将其标记为正确答案(仍在等待解释为什么会发生这种情况)跨度>
    猜你喜欢
    • 2015-05-08
    • 2018-02-12
    • 2018-01-09
    • 1970-01-01
    • 2012-09-30
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    相关资源
    最近更新 更多