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内のすべてのコンテンツは、複合コンポーネントのベースインスタンス(通常はNamingContainer)内のファセット上にあるUIPanel内にあります。

更新:コードを確認すると、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 に答える