我希望在已包含多个选项卡的现有功能区中动态添加或删除选项卡。如果可以“包含”我已经用XHTML编写的选项卡或合并两个ribbons,那就太好了。
我已经尝试使用添加选项卡
<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
}发布于 2019-01-09 01:32:43
你是对的。像<ui:repeat>和<p:repeat>这样的标签是在渲染时调用的。不能保证它们能与所有组件一起工作,这在很大程度上取决于它们是如何设计的。父组件必须支持动态渲染,并支持这些标记-否则就不走运了。
也就是说,您可以通过使用JSTL来解决这个问题,JSTL将在文档构建时而不是呈现时有效地创建ribbon。使用您的示例作为基础,这将像这样实现(请注意,此示例依赖于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来获得对这个主题的一些额外的见解;
https://stackoverflow.com/questions/54091337
复制相似问题