2014-10-03 73 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>