获取JSF2复合组件的父级的clientId

时间:2012-09-18 13:00:28

标签: jsf-2 composite-component

我有以下代码:

<h:dataTable id="dt" value="#{somelist}" var="entry">
    <h:column>
        #{entry.title}
    </h:column>
    <h:column>
        <h:commandLink id="lnk">
           <mycomp:doSomething id="dummy" />
        </h:commandLink>
    </h:column>
</h:dataTable>

我的复合组件(mycomp:doSomething)如下所示:

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:composite="http://java.sun.com/jsf/composite">

    <composite:interface>
    </composite:interface>

    <composite:implementation >     
        <script type="text/javascript">
            // #{component.parent.clientId}
        </script>        
    </composite:implementation>
</html>

我希望输出(#{component.parent.clientId})与此类似:dt:0:lnk但它返回dt:0:dummy,即复合组件的客户端ID。

如何获取真实父标记的ID?

1 个答案:

答案 0 :(得分:3)

请改用#{cc.parent.clientId}。复合内部的所有内容:实现位于复合组件基础实例内的facelet上的UIPanel内,该实例通常是NamingContainer。

更新:检查代码,cc.parent解析父复合组件而不是直接父组件。它似乎是一个旧的实现细节,但在规范中没有提到。在这个答案中提出的解决方案不起作用:(。

请参阅http://lists.jboss.org/pipermail/jsr-314-open-mirror/2010-February/002474.html

您可以绕过cc.parent的分辨率,提供扩展UINamingContainer的自定义组件类并添加:

<composite:interface componentType="my.custom.ComponentBaseClass">

然后添加一个像

这样的getter
public UIComponent getImmediateParent()
{
     return getParent();
}

最后使用#{cc.immediateParent.clientId}。它应该以这种方式工作。