0

ui:includeに含まれているファセットのclientIdを取得するにはどうすればよいですか?

再利用可能なコンポーネントの場合、次の構文を使用しますcc.clientId

編集1

問題は、絶対IDの決定のコンテキストにあります。動的エディターを含めるために、カスタムインクルードを使用します。

DynamicInclude、DynamicIncludeComponent、およびDynamicIncludeHandlerのソースコードは、http://pastebin.com/5e2dgR15にあります。getSrcDynamicIncludeのメソッドでsrcのnullをテストした行を削除し、getFamilynull以外の値を返すように変更する必要がありました。これは、私の場合に見つけて使用できる動的インクルードの唯一の実装です。現時点では、より良いものを作るための知識がありません。動的インクルードを持つことは、多くの場所で使用されるため、私のプロジェクトにとって非常に重要です(@BalusC:可能であれば、そのようなコンポーネントがOmniFacesに追加されることを望んでいます)。

絶対クライアントIDに関する私の問題は、のIDが生成される方法に関連してい<custom:include>ます。私の場合はtabs:0:editorsGroup:4:editor3です。<p:dataTable>またはなどの名前付けコンテナー<p:tabView>がid(tabs:0、editorsGroup:4)に番号を追加することを確認しました。このカスタムインクルードが100%NamingContainerであるかどうかはわかりません。DynamicIncludeComponentはNamingContainerを実装しますが、絶対クライアントIDをとして使用することはできません:tabs:editorsGroup:editor

絶対IDの決定organizationUnitエディターの場合、の更新で回避策を使用しました。を使用すると、cc.clientIdの一部が削除された後、絶対クライアントIDが計算されました。absolute_id_of_organization_unit#{eval.getAbsoluteId(cc.clientId, 'organizationUnit')

の助けを借りて更新を試みましたが、<p:remoteCommand>機能しませんでした。organizationUnitそのため、エディターの場合と同様の回避策を実行できると思いました。このために、getAbsoluteIdメソッドの最初のパラメーターである親IDを取得する必要がありました。

これらは私の奇妙な要求からの理由です。

4

1 に答える 1

0

に似た関数を作成することで問題を解決しました#{p:component(componentId)}。クライアントIDを返すだけでなく、生成されたクライアントIDから行インデックス情報も削除します。

関数は次のWEB-INF/utilsように定義されます。

... doctype ommited
<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
    <namespace>geneous.client.jsf/utils</namespace>
    <function>
        <function-name>absolute</function-name>
        <function-class>com.acme.util.ComponentUtils</function-class>
        <function-signature>java.lang.String getAbsoluteClientId(java.lang.String)</function-signature>
    </function>
</facelet-taglib>

中身web.xml

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/utils/utils.taglib.xml</param-value>
</context-param>

関数からのサンプルコード:

public static String getAbsoluteClientId(String id) {
    final String clientId = removeRowIndexFromClientId(id);
    FacesContext facesContext = FacesContext.getCurrentInstance();
    final char separator = UINamingContainer.getSeparatorChar(facesContext);        
    StringBuilder idBuilder = new StringBuilder();
    idBuilder.append(separator).append(clientId);
    return idBuilder.toString();        
}

public static String removeRowIndexFromClientId(String id) {
    String clientId = findComponentClientId(id);
    FacesContext facesContext = FacesContext.getCurrentInstance();
    final char separator = UINamingContainer.getSeparatorChar(facesContext);
    final String regex = String.valueOf(separator) + "[0-9]+";
    return clientId.replaceAll(regex, "");
}

関数はとして使用され#{<utils:absolute('componentId')>}ます。

于 2013-02-12T13:27:13.103 に答える