mit insertChildren UND erste child-Attribute
Ich bin wirklich versucht, erstellen Sie eine benutzerdefinierte zusammengesetzte Tabelle-Komponente, da h:datatable oder p:datatable nicht zu meinen Anforderungen passen. Dennoch verwendet werden soll, wie ein primefaces datatable.
Nach und nach fand ich JSF composite component Kinder
und
Setzen Elemente einer Liste während der Iteration innerhalb der composite component Sah ich die Ziellinie, aber jetzt bin ich stecken geblieben.
Meine 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 dies ist die datatable composite:
<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 Spalte composite
<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 funktioniert standalone
tbody funktioniert standalone
Setzen Sie zusammen, wie oben bekomme ich nur tbody. thead bleibt immer leer, Irgendwelche Vorschläge?
Vielen Dank für Eure Hilfe im Voraus!
<table id="my-table
- Umgehung JSF-id Verwendung von Namensräumen. Generell gilt: tun Sie das nicht - Sie sollten nur setzen, ids, um JSF-Komponenten, die nicht die grundlegenden HTML-tags. In diesem Fall, in der composite-Komponente haben, sollten Sie eine top-level-basic-HTML-tag, sondern setzen seine id zu#{cc.clientId}
. Soupdate="your_comp"
arbeiten.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist kein bug, es funktioniert tatsächlich wie vorgesehen in mojarra. Mit cc:insertChildren bewegt, die Kinder für die Eltern tag der cc:insertChildren tag. Dieses problem ist äquivalent zu einem anderen problem und hat die gleiche Lösung. Siehe meine Antwort auf diese Frage.
Grundsätzlich, setzen Sie ein
<ui:fragment>
rund um die<cc:insertChildren>
binden, das fragment einer Eigenschaft in einem FacesComponent bean.#{cc.children}
was gleichbedeutend ist mit#{component.getCompositeComponentParent(component).children}
sollten beide funktionierenaber aus irgendeinem Grund nicht funktionieren in einigen Versionen , ich denke, dieser Teil der JSF ist noch etwas buggy .
Haben Sie versucht,
Bitte diesen thread als gut,
In JSF2, wie Sie wissen, wenn composite component Kinder hat?
Ich hatte das gleiche Problem. Mein workaround war die Verwendung eines
renderFacet
stattinsertChildren
.Durchlaufen Sie die eingefügten Elemente die ich verwendet habe:
#{cc.facets.yourFacetName.children}
und legen Sie die Elemente an sich die ich verwendet habe:<composite:renderFacet name="yourFacetName"/>
.Ich gefunden habe Durchlaufen Kinder und Verwendung
<composite:insertChildren />
in der gleichen Komponente, die in der Nähe unmöglich. Zumindest in der Mojarra 2.2.6 Umsetzung.Intermediate Facette Ansatz hat nicht funktioniert für mich.
Schließlich, meine Lösung war:
encodeAll()
in die Gesichter Komponente entsprechend übergeordnetenDiese Frage ist über ein Jahr alt. Bitte teilen, wenn es eine einfachere Lösung in Sicht.