我想从已经包含多个选项卡的现有功能区中动态添加或删除选项卡。如果可以“包含”我已经在XHTML中编写的选项卡或合并两个功能区,那将是很棒的。
我已经尝试使用来添加标签
<p:repeat var="tab" value="#{ribbon.tabs}">
<p:tab binding="#{tab}" />
</p:repeat>
其中tabs是Tab的列表。
我还尝试将列表本身添加到绑定中,但是标签不能处理列表。
如果我添加此重复项,则没有错误,但未显示选项卡。这些选项卡是在Java中使用
生成的public void genTab() {
Tab t = new Tab();
t.setTitle("testTab");
t.setRendered(true);
t.setParent(FacesContext.getCurrentInstance().getViewRoot().findComponent("menu-ribbon"));
RibbonGroup r = new RibbonGroup();
r.setLabel("testgroup");
r.setRendered(true);
r.setParent(t);
addTab(t); //add to list of Tab
}
答案 0 :(得分:0)
您是正确的。在渲染期间会调用<ui:repeat>
和<p:repeat>
之类的标记。无法保证它们将与所有组件一起使用,并且高度取决于它们的设计方式。父组件必须支持动态渲染并支持这些标签-否则您就不走运。
话虽如此,您可以使用JSTL解决此问题,这将在文档构建期间而不是在渲染期间有效地创建功能区。以您的示例为基础,可以这样实现(请注意,该示例依赖于Lombok和Apache Commons);
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
<h:head>
<title>Dynamic Ribbon Test</title>
</h:head>
<h:body>
<h:form>
<p:ribbon>
<c:forEach var="tab" items="#{dynRibbonBackingBean.tabs}">
<p:tab binding="#{tab}" />
</c:forEach>
</p:ribbon>
</h:form>
</h:body>
@Data
@Named
@ViewScoped
public class DynRibbonBackingBean implements Serializable {
private List<Tab> tabs;
@PostConstruct
private void init() {
tabs = new ArrayList<>();
for (int i = 0; i < RandomUtils.nextInt(5, 15); i++) {
final Tab t = new Tab();
t.setLoaded(true);
t.setTitle(RandomStringUtils.randomAlphabetic(10));
final RibbonGroup r = new RibbonGroup();
r.setLabel(RandomStringUtils.randomAlphabetic(10));
r.setParent(t);
tabs.add(t);
}
}
}
这里,我们改用<c:forEach>
标签在文档构建期间迭代和构建动态功能区。在此示例中,我将在@PostConstruct
期间将功能区完全随机化,因此您可以重新加载页面,并观察每个页面加载时功能区的选项卡如何更改(计数和标题)。
您还可以通过参考此站点上的先前Q / A获得对该主题的更多了解;