2016-07-15 41 views
0

Blick durch einige PrimeFaces Code in einer App ich die folgende Zeile bemerkt:PrimeFaces Datatable - Was macht f: Facette eigentlich?

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

Es sieht aus wie es den Header überschreibt, was Sinn macht, aber kann jemand dies in etwas näher zu mir erklären?

Was passiert eigentlich mit dieser Codezeile?

komplette Code unten aufgeführt:

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

Antwort

4

Facets in JSF verwendet, um die Rendering eines Bauteils anpassen, ohne seinen Code zu berühren, wie der Kopf Facette in Datatable, in dem Sie benutzerdefinierte Code in Datatable-Header setzen können , ohne den eigentlichen PrimeFaces-Datat-Code zu berühren.

Die DataTableRenderer (Klasse, die HTML-Code der Datentabelle schreibt) ruft den xhtml-Code ab, den Sie in eine Facette einfügen, und rendert sie in einem div.

Sie können dies in der Methode sehen encodeFacet von DataTableRenderer:

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"); 
} 

Die Linie facet.encodeAll(context); macht den Code, den Sie innerhalb Facette als html setzen, in RENDER_RESPONSE JSF Phase.