假设我想<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解决方案)?
是的,这是可能的,但很困难。以下是我的一些笔记:
使用c:forEach 在outputPanel 内的tabPanel 内创建tab 标签。在选项卡删除、添加或名称更改时重新渲染输出面板
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 模板教程