2010-10-26 13 views
5

Supongamos que quiero crear un conjunto variable de elementos <rich:tab> dentro de un componente <rich:tabPanel>. Así que traté de hacerlo de la siguiente manera:¿Hay alguna manera de crear elementos dinámicamente <rich:tab>?

<rich:tabPanel switchType="client" ...> 
    <ui:repeat value="#{myBean.myTabs}" var="tab"> 
     <rich:tab name="#{tab.name}" label="#{tab.label}"/> 
    </ui:repeat> 
</rich:tabPanel> 

Pero no funcionó, ya que no se representa ninguna pestaña. También me dio el mensaje siguiente en los registros:

j_id174: tab panel has no enabled or rendered tabs! 

Este problema parece ser encontrado por otros personas, por ejemplo here.

Por lo sugerido por el hilo anterior, reemplacé mi <ui:repeat> por un <c:forEach> pero el problema persiste.


tengo una manera de resolver este problema mediante el atributo binding de mi <rich:tabPanel> componente:

<rich:tabPanel switchType="client" binding="#{tabNavigationBean.tabPanel}" 
</rich:tabPanel> 

y luego en mi grano de Java:

private HtmlTabPanel tabPanel; // + getter and setter 

public void setTabPanel(HtmlTabPanel tabPanel) { 
    this.tabPanel = tabPanel; 
    if (tabPanel != null) { 
     createTabs(); 
    } 
} 

private void createTabs() { 
    Application application = FacesContext.getCurrentInstance().getApplication(); 
    HtmlTab newTab = null; 
    for (DedicatedPageTab dpt : getDedicatedPageTabs()) { 
     newTab = (HtmlTab) application.createComponent(HtmlTab.COMPONENT_TYPE); 
     newTab.setLabel(dpt.getLabel()); 
     newTab.setName(dpt.getName()); 
     tabPanel.getChildren().add(newTab); 
    } 
} 

Este código está trabajando.

Sin embargo, mi pregunta es saber si puedo resolver mi problema sin usando el atributo binding (es decir, una solución pura XHTML 100%)?

+0

Información técnica: Java 1.6, JSF 1.2 + Facelets, richfaces 3.3 – romaintaz

+0

no sé si esto iba a funcionar mejor, pero trate ? – Naganalf

+0

@Naganalf también lo intentó, sin éxito :( – romaintaz

Respuesta

0

Sí, es posible, pero difícil. Aquí hay algunas notas que tengo:

Use c: forEach para crear etiquetas de pestaña dentro de tabPanel dentro de outputPanel. reRender outputPanel en la eliminación de pestaña, añadir o cambio de nombre

http://relation.to/11633.lace

http://devharbor.blogspot.com/2009/08/add-jsf-controls-dynamically-with.html


También hicimos uso de plantillas, todavía tengo un asunto pendiente para ello: How to force the build phase in a JSF 1.2 page using JSTL?

http://facelets.java.net/nonav/docs/dev/docbook.html#template Documentos sobre plantillas

http://www.jsfcentral.com/articles/facelets_3.html Templating tutorial

2
<a4j:outputPanel id="out"> 
    <rich:tabPanel> 
     <c:forEach items="list" var="var"> 
      <rich:tab label="#{var.name}" switchType="client"> 
       content 
      </rich:tab> 
     </c:forEach> 
    </rich:tabPanel> 
</a4j:outputPanel> 
Cuestiones relacionadas