2014-10-03 3 views
3

Я несколько новых для JSF и Primefaces, и я хотел бы сделать составной компонент, который содержит Primefaces GridPanel:Добавление столбцов в Primefaces PanelGrid с использованием составного компонента

<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> 

 Смежные вопросы

  • Нет связанных вопросов^_^