我对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>
但是当我这样做时...... Facets不会被添加。我认为这可能与无法使用<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>
这假设我将复合材料修改为:
{{1}}
任何人都可以提供任何替代方案或建议如何使用模式吗?
谢谢!
答案 0 :(得分:0)
我会发布我的解决方法,这在技术上并不是一个解决方案 - 所以我认为将其标记为非常公平。
这不是一个真正解决方案的原因是因为它实际上并没有使用Primefaces <p:panelGrid>
(其布局选项我慢慢开始厌恶 - 但是这是另一个主题)而只是使用HTML5 <table>
。它实现了我想要的总体目标,但需要我确保手动将所有正确的Primefaces样式添加到表格小部件中,以使外观保持一致。
如果有人有替代解决方案,我很乐意看到它。
<composite:interface>
<composite:attribute name="bind" type="com.whatever.IBackingBean"/>
<composite:facet name="headerCols"/>
<composite:facet name="bodyCols"/>
</composite:interface>
<composite:implementation>
<h:form>
<table>
<tr>
<composite:renderFacet name="headerCols"/>
<th>
<h:outputText value="Col1" />
</th>
<th>
<h:outputText value="Col2" />
</th>
<th>
<h:outputText value="Col3" />
</th>
</tr>
<tr>
<composite:renderFacet name="bodyCols"/>
<td>
<h:outputText value="#{cc.attrs.bind.prop1}" />
</td>
<td>
<h:outputText value="#{cc.attrs.bind.prop2}" />
</td>
<td>
<h:outputText value="#{cc.attrs.bind.prop3}" />
</td>
</tr>
</table>
</h:form>
</composite:implementation>