【问题标题】:How to add pe:badge to dynamically created menu in bean using PrimeFaces如何使用 PrimeFaces 将 pe:badge 添加到 bean 中动态创建的菜单
【发布时间】:2021-06-13 19:02:42
【问题描述】:

我正在将静态菜单重写为动态菜单,因为我们的客户想要动态地更改菜单。在此之前,我的 xhtml 中有标准的

结构。

但现在我已将其更改为: <p:menu model="#{pageTemplateView.menuModel}"/>

我正在像这样在我的支持 bean 中创建模型:

DefaultMenuItem menuItem = new DefaultMenuItem();
menuItem.setIcon(item.getIcon());
menuItem.setTarget(item.getLink());
menuItem.setValue(item.getName());

但问题是我不知道如何在 bean 的菜单项中添加 <pe:badge> 组件。

在此之前,我通过以下方式将徽章添加到菜单中:

<p:menuitem id="tasks_icon_menuitem_id" icon="fa fa-tasks" url="#">
  <pe:badge content="#{badgeCountBean.badgeCount()}"/>
</p:menuitem> 

那么如何将&lt;pe:badge&gt; 添加到 bean 中动态创建的菜单中?

我正在使用 PrimeFaces 8

【问题讨论】:

  • 您可以尝试使用for 属性。请注意,徽章在 PFE 10 中已弃用。
  • 我也不确定我们是否对 MenuItems 进行了测试?
  • 嘿,我尝试过使用for,但它似乎不起作用。
  • @Melloware 不,它最初只适用于按钮,但我删除了该限制以便能够在头像上使用它。

标签: jsf primefaces primefaces-extensions


【解决方案1】:

经过几个小时的测试和四处游荡,我发现了阻止我将徽章添加到默认菜单项的问题。 问题是当您尝试像这样将孩子添加到DefaultManuItem 时:

Badge badge = new Badge();
DefaultMenuItem defaultMenuItem = new DefaultMenuItem();
defaultMenuItem.getChildren().add(badge);

由于 DefaultMenuItem::getChildren() 是这样实现的,因此您会得到不受支持的操作异常:

public List<UIComponent> getChildren() {
    return Collections.emptyList();
}

但是我发现了一个丑陋的解决方法来解决这个问题。所以我可能会分享它,并且可能会得到更好的解决方案。 在我的 xhtml 中,我添加了空菜单并给它固定的 ID,如下所示:

<!-- MENU PLACEHOLDER -->
<p:menu id="dynamic_menu_placeholder"/>

<!-- need to add dummy badge to xhtml otherwise it wont be displayed -->
<pe:badge/>

然后在我的 bean 中,我通过 ID 获取组件,并向其中添加 UIMenuItem 元素,如下所示:

// get component by ID
UIComponent component = FacesContext.getCurrentInstance().getViewRoot().findComponent(":form:dynamic_menu_placeholder");
Menu menu = (Menu) component;
menu.getChildren().clear();

for (MenuItem item : menuItemList) {

    // creating menu item
    UIMenuItem menuItem = new UIMenuItem();
    menuItem.setUrl(item.getLink());
    menuItem.setValue(item.getValue());
    menuItem.setId(... generated some id);
    
    // creating badge
    Badge badge = new Badge();
    badge.setContent(...getBadgeCount()..);
    
    // adding badge to menu item
    menuItem.getChildren().add(badge);
}

// addin menu item to menu
menu.getChildren().add(menuItem);

【讨论】:

  • 请注意,如果您要迁移到 Primefaces 10,您应该使用 PF Core Badge 而不是 PFE Badge,因为它在 10.0.1 中被删除,因为 PF 有一个真正的 Badge 组件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多