2013-03-07 23 views
5

In realtà sto provando a creare un componente tabella composito personalizzato perché h: datatable o p: datatable non soddisfano le mie esigenze. Tuttavia deve essere usato come un primimetro datatable. Dopo aver trovato JSF composite component childrens e Expose items of a list while iterating within composite component ho visto il traguardo, ma ora mi sono bloccato.utilizzando insertChildren E ottenere attributi figlio

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

E questo è il composito datatable:

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

E questo è il colonna composta

<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 funziona in modo indipendente

tbody funziona in modo indipendente

Metterli insieme come sopra ho solo tbody. thead rimane sempre vuoto Qualche suggerimento? Grazie per il tuo aiuto in Advance!

+0

'

risposta

1

#{cc.children} che equivale a #{component.getCompositeComponentParent(component).children} dovrebbero lavorare sia ma per qualche ragione non funzionare in alcune versioni, immagino questa parte del JSF è ancora poco buggy.

Hai provato

#{cc.getFacets().get('javax.faces.component.COMPOSITE_FACET_NAME').children} 

fare riferimento questa discussione pure,

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

+1

Ho appena provato ma non funziona davvero. solo child è l'implementazione stessa. Pertanto l'output per _ # {child} _ è _

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

1

ho avuto lo stesso problema. La mia soluzione alternativa era utilizzare un renderFacet, anziché insertChildren.

Per iterare sugli elementi inseriti che ho utilizzato: #{cc.facets.yourFacetName.children} e per inserire gli elementi stessi che ho usato: <composite:renderFacet name="yourFacetName"/>.

1

Ho trovato iterando sui bambini e utilizzando <composite:insertChildren /> nello stesso componente per essere quasi impossibile. Almeno nell'implementazione di Mojarra 2.2.6.

Anche l'approccio a facce intermedie non ha funzionato.

Alla fine, la mia soluzione era quella di:

  1. mantengono il componente figlio (scheda), come è
  2. rimuovere tutto il codice dal composito: implementazione di un genitore (gruppo di schede) componente
  3. attuare encodeAll() in il componente facce corrispondente al componente padre

Questa domanda ha più di un anno. Si prega di condividere se c'è una soluzione più semplice in vista.

4

Questo non è un bug, in realtà funziona come progettato in mojarra. L'utilizzo di cc: insertChildren sposta i figli nel tag principale del tag cc: insertChildren. Questo problema è equivalente a un altro problema e ha la stessa soluzione. Vedere la mia risposta allo this question.

Fondamentalmente, si inserisce uno <ui:fragment> attorno allo <cc:insertChildren>, associare tale frammento a una proprietà in un bean FacesComponent.