假设我想在<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解决方案)解决没有的问题?
答案 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://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 关于模板的文件