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

时间:2010-10-26 09:12:49

标签: 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>

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

j_id174: tab panel has no enabled or rendered tabs!

其他人似乎遇到了这个问题,例如here

正如前一个主题所示,我将<ui:repeat>替换为<c:forEach>,但问题仍然存在。


我可以使用binding组件的<rich:tabPanel>属性解决此问题:

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

然后在我的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);
    }
}

此代码正常运作

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

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

是的,这是可能的,但很难。以下是我的一些注意事项:

使用c:forEach在outputPanel内的tabPanel内创建选项卡标签。选项卡删除,添加或名称更改时的reRender outputPanel

http://relation.to/11633.lace

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


我们也使用了模板,但我仍然有一个突出的问题:How to force the build phase in a JSF 1.2 page using JSTL?

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

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