Я новичок в JSF и Primefaces, и я хотел бы создать составной компонент, содержащий Primefaces GridPanel:
<composite:interface>
<composite:attribute name="bind" type="com.whatever.IBackingBean"/>
<composite:facet name="headerCols"/>
<composite:facet name="bodyCols"/>
</composite:interface>
<composite:implementation>
<h:form>
<p:panelGrid>
<p:row>
<composite:renderFacet name="headerCols"/>
<p:column>
<h:outputText value="Col1" />
</p:column>
<p:column>
<h:outputText value="Col2" />
</p:column>
<p:column>
<h:outputText value="Col3" />
</p:column>
</p:row>
<p:row>
<composite:renderFacet name="bodyCols"/>
<p:column>
<h:outputText value="#{cc.attrs.bind.prop1}" />
</p:column>
<p:column>
<h:outputText value="#{cc.attrs.bind.prop2}" />
</p:column>
<p:column>
<h:outputText value="#{cc.attrs.bind.prop3}" />
</p:column>
</p:row>
</p:panelGrid>
</h:form>
</composite:implementation>
И хотел бы использовать что-то вроде:
<x:mycomposite bind="#{myBackingBean}">
<f:facet name="headerCols">
<p:column>
<h:outputText value="My Extra Prop"/>
</p:column>
</f:facet>
<f:facet name="bodyCols">
<p:column>
<h:outputText value="#{myBackingBean.extraProp}"/>
</p:column>
</f:facet>
</x:mycomposite>
Но когда я это делаю ... Аспекты не добавляются. Я думаю, что это, возможно, как-то связано с невозможностью использовать <composite:renderFacet>
в качестве параметра для <p:panelGrid>
, который также (предположительно) является составным.
Поскольку мне нужно добавлять столбцы, а не строки, мне нужно добавлять в нескольких местах, поэтому <composite:insertChildren>
не работает.
Предположительно, я мог бы просто использовать атрибут, но как передать значение элемента в качестве значения атрибута? Поскольку что-то вроде этого, похоже, недоступно:
<x:mycomposite bind="#{myBackingBean}">
<f:attribute name="headerCols">
<p:column>
<h:outputText value="My Extra Prop"/>
</p:column>
</f:attribute>
<f:attribute name="bodyCols">
<p:column>
<h:outputText value="#{myBackingBean.extraProp}"/>
</p:column>
</f:attribute>
</x:mycomposite>
Предполагая, что я изменил композицию на:
<composite:interface>
<composite:attribute name="bind" type="com.whatever.IBackingBean"/>
<composite:attribute name="headerCols"/>
<composite:attribute name="bodyCols"/>
</composite:interface>
<composite:implementation>
<h:form>
<p:panelGrid>
<p:row>
#{cc.attrs.headerCols}
<p:column>
<h:outputText value="Col1" />
</p:column>
<p:column>
<h:outputText value="Col2" />
</p:column>
<p:column>
<h:outputText value="Col3" />
</p:column>
</p:row>
<p:row>
#{cc.attrs.bodyCols}
<p:column>
<h:outputText value="#{cc.attrs.bind.prop1}" />
</p:column>
<p:column>
<h:outputText value="#{cc.attrs.bind.prop2}" />
</p:column>
<p:column>
<h:outputText value="#{cc.attrs.bind.prop3}" />
</p:column>
</p:row>
</p:panelGrid>
</h:form>
</composite:implementation>
Может ли кто-нибудь предоставить альтернативу или посоветовать, как заставить работать шаблон использования?
Спасибо!