2013-03-07 14 views
5

Ich versuche tatsächlich, eine benutzerdefinierte Composite-Tabellenkomponente zu erstellen, weil h: datatable oder p: datatable nicht meinen Anforderungen entsprechen. Nichtsdestoweniger soll es wie eine Dataset der Primzahlen verwendet werden. Nachdem ich JSF composite component childrens und Expose items of a list while iterating within composite component gefunden habe, sah ich die Ziellinie, aber jetzt steckte ich fest.Verwendung von insertChildren AND bekomme untergeordnete Attribute

Mein xhtml:

<h:body> 
    <sm:datatable mode="columntoggle" id="mytable" value="#{managerBean.objects}" var="object"> 
     <sm:column header="KeyHeader" property="key"> 
      <h:outputText value="#{object.key}"/>  
     </sm:column> 
     <sm:column header="ValueHeader" property="value"> 
      <h:outputText value="#{object.value}"/>  
     </sm:column> 
    </sm:datatable> 
</h:body> 

Und das ist die Datentabelle Verbund:

<cc:interface> 
    <cc:attribute name="id" /> 
    <cc:attribute name="mode" /> 
    <cc:attribute name="var" /> 
    <cc:attribute name="value" type="java.util.List"/> 
</cc:interface> 

<cc:implementation> 
    <table data-role="table" data-mode="#{cc.attrs.mode}" id="my-table"> 
     <thead> 
      <tr> 
       <ui:repeat value="#{component.getCompositeComponentParent(component).children}" var="child"> 
        <th> 
         <h:outputText value="#{child.attrs.header}"/> 
        </th> 
       </ui:repeat> 
      </tr> 
     </thead> 
     <tbody> 
      <ui:repeat value="#{cc.attrs.value}" var="object"> 
       <tr> 
        <c:forEach items="#{cc.children}" var="child" varStatus="loop"> 
         <cc:insertChildren/> 
        </c:forEach> 
       </tr> 
      </ui:repeat> 
     </tbody> 
    </table> 
</cc:implementation> 

Und das ist die Säule Verbund

<cc:interface> 
    <cc:attribute name="header" /> 
    <cc:attribute name="property" /> 
    <cc:facet name="content"/> 
</cc:interface> 

<cc:implementation> 
    <td><cc:insertChildren/></td> 
</cc:implementation> 

Thead Werke standalone

tbody wie

Putting sie zusammen eigenständige Werke über I tbody nur bekommen. thead bleibt immer leer Irgendwelche Vorschläge? Vielen Dank für Ihre Hilfe im Voraus!

+0

'

Antwort

1

#{cc.children}, die äquivalent ist #{component.getCompositeComponentParent(component).children} sollten beide arbeiten, aber aus irgendeinem Grund nicht in einigen Versionen arbeiten, ich denke, dieser Teil von JSF noch wenig fehlerhaft ist.

Haben Sie

versucht, auch dieses Thema beziehen
#{cc.getFacets().get('javax.faces.component.COMPOSITE_FACET_NAME').children} 

Bitte,

In JSF2, how to know if composite component has children?

+1

Ich habe es gerade ausprobiert, funktioniert aber nicht wirklich Nur Kind ist die Implementierung selbst. Deshalb ist die Ausgabe für _ # {Kind} _ _

\t [email protected] \t \t [email protected] \t
_ – CrisbyJ

1

ich das gleiche Problem haben. Meine Abhilfe bestand darin, eine renderFacet statt insertChildren zu verwenden.

Um über die eingefügten Elemente zu iterieren: #{cc.facets.yourFacetName.children} und zum Einfügen der Elemente habe ich selbst verwendet: <composite:renderFacet name="yourFacetName"/>.

1

Ich habe festgestellt, über Kinder und mit <composite:insertChildren /> in der gleichen Komponente zu iterieren, um nahezu unmöglich zu sein. Zumindest in der Mojarra 2.2.6 Implementierung.

Der intermediäre Facettenansatz funktionierte auch nicht für mich.

Schließlich war meine Lösung:

  1. das Kind Komponente (tab) behalten wie
  2. den gesamten Code aus dem Verbund entfernen: Umsetzung der Eltern (Tab-Gruppe) Komponente
  3. implementieren encodeAll() in die der Teilkomponente entsprechende Teilkomponente

Diese Frage ist älter als ein Jahr. Bitte teilen Sie mit, wenn eine einfachere Lösung in Sicht ist.

4

Dies ist kein Fehler, es funktioniert tatsächlich wie in Mojarra entworfen. Durch die Verwendung von cc: insertChildren werden die untergeordneten Elemente in das übergeordnete Tag des Tags cc: insertChildren verschoben. Dieses Problem entspricht einem anderen Problem und hat die gleiche Lösung. Siehe meine Antwort auf this question.

Grundsätzlich setzen Sie eine <ui:fragment> um die <cc:insertChildren>, binden Sie das Fragment an eine Eigenschaft in einer FacesComponent-Bean.

Verwandte Themen