是否可以在主界面中将选项卡动态添加/删除到功能区

时间:2019-01-08 11:56:47

标签: jsf primefaces

我想从已经包含多个选项卡的现有功能区中动态添加或删除选项卡。如果可以“包含”我已经在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
}

1 个答案:

答案 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获得对该主题的更多了解;

When <ui:repeat> works for X but <c:forEach> works for Y