有没有办法动态创建<rich:tab>元素?

Rom*_*las 5 jsf richfaces

假设我想<rich:tab><rich:tabPanel>组件中创建一组可变元素.所以我试着这样做:

<rich:tabPanel switchType="client" ...>
    <ui:repeat value="#{myBean.myTabs}" var="tab">
        <rich:tab name="#{tab.name}" label="#{tab.label}"/>
    </ui:repeat>
</rich:tabPanel>
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为没有标签被渲染.我还在日志中收到以下消息:

j_id174: tab panel has no enabled or rendered tabs!
Run Code Online (Sandbox Code Playgroud)

这个问题似乎是其他人遇到的,例如这里.

所以正如前一个帖子所建议的那样,我用<ui:repeat>一个替换了我,<c:forEach>但问题仍然存在.


我有办法使用binding我的<rich:tabPanel>组件的属性来解决这个问题:

<rich:tabPanel switchType="client" binding="#{tabNavigationBean.tabPanel}"
</rich:tabPanel>
Run Code Online (Sandbox Code Playgroud)

然后在我的Java bean中:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码正在运行.

但是,我的问题是要知道我是否可以在使用binding属性的情况下解决我的问题(即100%纯XHTML解决方案)?

Ada*_*dam 0

是的,这是可能的,但很困难。以下是我的一些笔记:

使用c:forEach 在outputPanel 内的tabPanel 内创建tab 标签。在选项卡删除、添加或名称更改时重新渲染输出面板

http://relation.to/11633.lace

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


我们还使用了模板,但我仍然有一个悬而未决的问题:如何使用 JSTL 在 JSF 1.2 页面中强制构建阶段?

http://facelets.java.net/nonav/docs/dev/docbook.html#template 有关模板的文档

http://www.jsfcentral.com/articles/facelets_3.html 模板教程