无法在父组合组件中找到名为“header”的构面

时间:2014-01-23 07:47:42

标签: jsf jsf-2 primefaces ajax4jsf

我已经使用primefaces在JSF中实现了一个复合组件。

<ui:component ...>
    <cc:interface>
            <cc:facet name="header"/> ...
    <cc:interface>

<cc:implementation>
   <p:dataTable>
    <f:facet name="header">
       <c:choose>
         <c:when test="#{empty cc.attrs.metadata.headerText}">
            <cc:insertFacet name="header" required="true"/>
        </c:when>
        <c:otherwise>
        #{cc.attrs.headerText}
        </c:otherwise>
       </c:choose>
    </f:facet> ...
   </dataTable>
</cc:implementation>

当我在普通页面中使用它时,它可以正常工作,渲染数据表。

<ui:composition>
    <nav:dataTable/>
        <f:facet name="header">
            <h:outputText value="headerText" />
        </f:facet>
</ui:composition>

但是当我在使用上述复合组件的对话框中使用它时,它会抛出

component.xhtml @ 28,54

  

无法在父级中找到名为“header”的构面   ID为'j_idt129'的复合组件

我正在进行ajax调用,以便在单击链接时调用此对话框。对话框有不同的形状,并在控制台中抛出此错误。有人面对过吗?任何帮助都非常明显。

1 个答案:

答案 0 :(得分:2)

cc:insertFacet会插入整个f:facet标记,因此您不应将其包装到复合实现中的另一个f:facet标记中。当您编写自定义p:dataTable时,我认为将现有的header facelet覆盖为接口声明并使用JSTL实用程序有条件地呈现它更容易:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:composite="http://java.sun.com/jsf/composite"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:c="http://java.sun.com/jsp/jstl/core">

<h:body>
    <composite:interface>
        <composite:facet name="header" />
        <composite:attribute name="title" />
    </composite:interface>

    <composite:implementation>
        <p:dataTable>
            <!-- If the facet is given at parent, insert it. 
            Otherwise, provide the title given by the attribute -->
            <c:choose>
                <c:when test="#{not empty cc.facets.header}">
                    <composite:insertFacet name="header" />
                </c:when>
                <c:otherwise>
                    <f:facet name="header">
                        #{cc.attrs.title}
                    </f:facet>
                </c:otherwise>
            </c:choose>

            <p:column headerText="column" />
        </p:dataTable>
    </composite:implementation>
</h:body>
</html>

将其用作:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:p="http://primefaces.org/ui"
    xmlns:comp="http://java.sun.com/jsf/composite/comp">

<f:view>
    <h:head />
    <h:body>
        <h:form>
            <comp:myTable title="header">
                <f:facet name="header">
                    <h:outputText value="text" />
                </f:facet>
            </comp:myTable>

            <comp:myTable title="Custom header" />

            <p:commandButton type="button" onclick="dialog.show()"
                value="show in dialog" />

            <p:dialog widgetVar="dialog">
                <comp:myTable title="header">
                    <f:facet name="header">
                        <h:outputText value="text" />
                    </f:facet>
                </comp:myTable>
            </p:dialog>

        </h:form>
    </h:body>
</f:view>
</html>