2010-10-26 19 views
5

Giả sử tôi muốn tạo tập hợp các phần tử <rich:tab> biến trong một thành phần <rich:tabPanel>. Vì vậy, tôi đã cố gắng thực hiện theo cách đó:Có cách nào để tạo các yếu tố động <rich:tab> không?

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

Nhưng nó không hoạt động, vì không có tab nào được hiển thị. Tôi cũng nhận được thông báo sau trong nhật ký:

j_id174: tab panel has no enabled or rendered tabs! 

Vấn đề này dường như gặp phải bởi những người khác, ví dụ here.

Vì vậy, theo đề xuất của chủ đề trước, tôi đã thay thế <ui:repeat> bởi <c:forEach> nhưng sự cố vẫn xảy ra.


Tôi có một cách để giải quyết vấn đề này bằng cách sử dụng binding thuộc tính của <rich:tabPanel> phần của tôi:

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

và sau đó trong chương trình Java của tôi:

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); 
    } 
} 

Mã này đang làm việc.

Tuy nhiên, câu hỏi của tôi là biết tôi có thể giải quyết vấn đề của mình mà không cần sử dụng thuộc tính binding (tức là 100% giải pháp XHTML thuần túy) không?

+0

Thông tin kỹ thuật: Java 1.6, JSF 1.2 + Facelets, RichFaces 3.3 – romaintaz

+0

Tôi không biết nếu điều này sẽ làm việc bất kỳ tốt hơn, nhưng thử ? – Naganalf

+0

@Naganalf cũng đã cố gắng, không thành công: ( – romaintaz

Trả lời

0

Có, có thể, nhưng khó khăn. Dưới đây là một số ghi chú tôi có:

Sử dụng c: forEach để tạo thẻ tab bên trong tabPanel bên trong outputPanel. reRender outputPanel trên loại bỏ tab, thêm, hoặc thay đổi tên

http://relation.to/11633.lace

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


Chúng tôi cũng đã sử dụng khuôn mẫu, mặc dù tôi vẫn còn có một vấn đề nổi bật cho nó: How to force the build phase in a JSF 1.2 page using JSTL?

http://facelets.java.net/nonav/docs/dev/docbook.html#template Tài liệu trên templating

http://www.jsfcentral.com/articles/facelets_3.html Templating hướng dẫn

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> 
Các vấn đề liên quan