0

如何检索包含在 ui:include 中的 facelet 的 clientId?

对于可重用组件,我使用以下语法:cc.clientId.

编辑1

问题是在确定绝对 id的上下文中。要包含动态编辑器,我使用自定义 include

DynamicInclude、DynamicIncludeComponent 和 DynamicIncludeHandler 的源代码可以在:http ://pastebin.com/5e2dgR15 找到。我不得不删除在getSrcDynamicInclude 的方法中测试 src 是否为 null 的行,并更改getFamily为返回一个非 null 值。这是我在我的案例中可以找到和使用的唯一动态包含的实现。在这一刻,我没有知识做一个更好的。拥有动态包含对我的项目至关重要,因为它在很多地方都使用过(@BalusC:如果可能的话,我希望看到这样的组件被添加到 OmniFaces 中)。

我对绝对客户端 ID 的问题与为<custom:include>. 在我的情况下是tabs:0:editorsGroup:4:editor3. 我已经看到命名容器,例如<p:dataTable>or <p:tabView>,会在 id(tabs:0, editorsGroup:4) 中添加一个数字。我不确定这个自定义包含是否 100% 是 NamingContainer。DynamicIncludeComponent 实现 NamingContainer,但我不能将绝对客户端 ID 用作:tabs:editorsGroup:editor.

对于来自确定绝对 idorganizationUnit的编辑器,我在更新中使用了一种解决方法。使用,在 cc.clientId 的某些部分被删除后,计算了绝对客户端 ID。absolute_id_of_organization_unit#{eval.getAbsoluteId(cc.clientId, 'organizationUnit')

我曾尝试在 a 的帮助下进行更新<p:remoteCommand>,但没有成功。所以我认为我可以为organizationUnit编辑器做一个类似的解决方法。为此,我必须获取父 ID,即 getAbsoluteId 方法的第一个参数。

这些是我奇怪的要求的原因。

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 回答