JSF 2.0 Composite组件 - ajax呈现参数OUTSIDE组件定义

jam*_*mes 4 java jsf-2

考虑一个简单的复合组件,它采用某种动作参数 - 例如,一个简单的链接'美化'.我想'ajaxify'它.

   <composite:interface>
        <composite:attribute name="act" method-signature="java.lang.String action()"></composite:attribute>
        <composite:attribute name="text" required="true"></composite:attribute>
            <composite:clientBehavior  name="click" event="action"  targets="l"/>    </composite:interface>

   <composite:implementation>
        <h:commandLink id="l" act="#{cc.attrs.action}" immediate="true">            <b>#{cc.attrs.text}</b>         </h:commandLink>    </composite:implementation>
Run Code Online (Sandbox Code Playgroud)

我通过客户端行为公开事件.我这样使用它:

<h:panelGroup layout="block" id="outside">

        #{mybean.otherdata} <br/>

                <mc:mylink text="Click click" action="#{mybean.click}" >
                    <f:ajax event="click" render="outside"/>"
                </mc:mylink><br/>

</h:panelGroup>
Run Code Online (Sandbox Code Playgroud)

你可以看到我想做的事情:我想在复合定义之外做一个ajax渲染; 只是将渲染设置为"外部"会产生可怕的<f:ajax> contains an unknown id错误.

是的,我知道命名容器,我知道我们可以用冒号前置并指定一个绝对路径,但这很笨重.如果我将它包装在更多层中(这是整点),我必须手动将这些引用链接在一起.

我是否可以进行某种相对引用,例如render="../outside"跳过对组件父容器的引用?

我用a4j做了一个jsf 1应用程序,这个模式在整个地方都被使用了.

Tuu*_*nen 7

在JSF 2.0中,您可以使用EL中的隐式cccomponent对象.要获取任何组件的完整客户端ID,请执行以下操作:

#{component.clientId}
Run Code Online (Sandbox Code Playgroud)

要检索复合组件的客户端ID,请执行以下操作:

#{cc.clientId}
Run Code Online (Sandbox Code Playgroud)

以同样的方式,您也可以使用获取父级#{cc.parent}.在这种情况下,这可能是你想要的.有关更长的答案,请参阅使用JSF 2.0获取命名容器内的组件clientId的完整前缀.