1

我有以下代码:

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

4

1 回答 1

3

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

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

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

您可以绕过 cc.parent 的解析,提供自定义组件类扩展 UINamingContainer 并添加以下内容:

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

然后添加一个像

public UIComponent getImmediateParent()
{
     return getParent();
}

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

于 2012-09-18T17:18:33.487 回答