2014-10-03 34 views
3

将列添加到Primefaces panelGrid的我有点新的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> 

任何人都可以提供任何替代方案或如何使使用模式的工作建议?

谢谢!

回答

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>