PrimeFaces数据表格 - f:facet实际上是在做什么?

3

在查看应用程序中的一些PrimeFaces代码时,我注意到以下行:

<f:facet name="header">#{trainSearch.trainCount} Trains</f:facet>

看起来它正在覆盖标题,这很合理,但是有人能否更详细地解释一下这个问题吗?

这行代码实际上在发生什么?

下面列出了完整的代码:

           <p:dataTable id = "results" value = "#{trainSearch.trains}" var = "train"     rendered="#{not empty trainSearch.trains}" styleClass = "train-search-table horizontal-border">
                <f:facet name="header">#{trainSearch.trainCount} Trains</f:facet> 
                <p:column headerText = "Train ID">
                    <p:panelGrid columns="1" styleClass = "train-id-grid" layout = "grid">
                        <h:outputText styleClass = "train-id-label" value="#{train.trainI}"/>
                        <h:outputText value="#{train.originCityState} > #{train.destinationCityState}" />
                    </p:panelGrid>
                </p:column>
                <p:column headerText="Scheduled Departure">
                    <h:outputText value="#{train.formattedScheduledDepartureText}" />
                </p:column>
                <p:column headerText="Scheduled Arrival">
                    <h:outputText value="#{train.formattedScheduledArrivalText}" />
                </p:column>
                 <p:column headerText="Loco Count">
                    <h:outputText value="#{train.locoCount}" />
                </p:column>
                <p:column headerText="Car Count">
                    <h:outputText value="#{train.carCount}" />
                </p:column>
            </p:dataTable>
1个回答

7

JSF中的Facets用于自定义组件的渲染,而不需要触及其代码,比如在数据表格中使用的头部Facet,您可以在其中放置自定义代码,而不需要触碰实际的PrimeFaces数据表格代码。

DataTableRenderer(编写数据表格html代码的类)获取您放置在Facet内的xhtml代码,并将其呈现在一个div内。

您可以在DataTableRendererencodeFacet方法中看到这一点:

protected void encodeFacet(FacesContext context, DataTable table, UIComponent facet, String styleClass) throws IOException {
    if(facet == null)
        return;

    ResponseWriter writer = context.getResponseWriter();

    writer.startElement("div", null);
    writer.writeAttribute("class", styleClass, null);

    facet.encodeAll(context);

    writer.endElement("div");
}

facet.encodeAll(context); 这一行在 jsf 的 RENDER_RESPONSE 阶段会将您放在 facet 中的代码呈现为 html。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接