首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在primefaces中动态向ribbon添加/删除选项卡

是否可以在primefaces中动态向ribbon添加/删除选项卡
EN

Stack Overflow用户
提问于 2019-01-08 19:56:47
回答 1查看 133关注 0票数 1

我希望在已包含多个选项卡的现有功能区中动态添加或删除选项卡。如果可以“包含”我已经用XHTML编写的选项卡或合并两个ribbons,那就太好了。

我已经尝试使用添加选项卡

代码语言:javascript
复制
<p:repeat var="tab" value="#{ribbon.tabs}">
    <p:tab binding="#{tab}" />
</p:repeat>

其中tabs是Tab的列表。

我还尝试将列表本身添加到绑定中,但标记不能处理列表。

如果我添加了这个重复,就不会有错误,但不显示选项卡。选项卡是用java生成的,使用

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

发布于 2019-01-09 01:32:43

你是对的。像<ui:repeat><p:repeat>这样的标签是在渲染时调用的。不能保证它们能与所有组件一起工作,这在很大程度上取决于它们是如何设计的。父组件必须支持动态渲染,并支持这些标记-否则就不走运了。

也就是说,您可以通过使用JSTL来解决这个问题,JSTL将在文档构建时而不是呈现时有效地创建ribbon。使用您的示例作为基础,这将像这样实现(请注意,此示例依赖于Lombok和Apache Commons);

代码语言:javascript
复制
<?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>

代码语言:javascript
复制
@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 works for X but works for Y

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54091337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档