Jsf 如何使用PrimeFaces将pe:badge添加到bean中动态创建的菜单

Jsf 如何使用PrimeFaces将pe:badge添加到bean中动态创建的菜单,jsf,primefaces,primefaces-extensions,Jsf,Primefaces,Primefaces Extensions,我正在将静态菜单重写为动态菜单,因为我们的客户希望动态地更改菜单。在此之前,我的xhtml中有标准结构 但现在我把它改成: 我在我的支持bean中创建模型,如下所示: DefaultMenuItem menuItem = new DefaultMenuItem(); menuItem.setIcon(item.getIcon()); menuItem.setTarget(item.getLink()); menuItem.setValue(item.getName()); Badge bad

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

但现在我把它改成:

我在我的支持bean中创建模型,如下所示:

DefaultMenuItem menuItem = new DefaultMenuItem();
menuItem.setIcon(item.getIcon());
menuItem.setTarget(item.getLink());
menuItem.setValue(item.getName());
Badge badge = new Badge();
DefaultMenuItem defaultMenuItem = new DefaultMenuItem();
defaultMenuItem.getChildren().add(badge);
public List<UIComponent> getChildren() {
    return Collections.emptyList();
}
<!-- MENU PLACEHOLDER -->
<p:menu id="dynamic_menu_placeholder"/>

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

// 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);
但问题是我不知道如何在bean的菜单项中添加
组件

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

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

那么,如何将
添加到bean中动态创建的菜单中呢


我正在使用PrimeFaces 8

经过几个小时的测试,我发现了一个问题,它阻止我将badge添加到默认菜单项中。 问题是当您尝试向
DefaultManuItem
添加子项时,如下所示:

DefaultMenuItem menuItem = new DefaultMenuItem();
menuItem.setIcon(item.getIcon());
menuItem.setTarget(item.getLink());
menuItem.setValue(item.getName());
Badge badge = new Badge();
DefaultMenuItem defaultMenuItem = new DefaultMenuItem();
defaultMenuItem.getChildren().add(badge);
public List<UIComponent> getChildren() {
    return Collections.emptyList();
}
<!-- MENU PLACEHOLDER -->
<p:menu id="dynamic_menu_placeholder"/>

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

// 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);
由于DefaultMenuItem::getChildren()的实现方式如下,因此会出现不受支持的操作异常:

DefaultMenuItem menuItem = new DefaultMenuItem();
menuItem.setIcon(item.getIcon());
menuItem.setTarget(item.getLink());
menuItem.setValue(item.getName());
Badge badge = new Badge();
DefaultMenuItem defaultMenuItem = new DefaultMenuItem();
defaultMenuItem.getChildren().add(badge);
public List<UIComponent> getChildren() {
    return Collections.emptyList();
}
<!-- MENU PLACEHOLDER -->
<p:menu id="dynamic_menu_placeholder"/>

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

// 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);

您可以尝试使用
for
属性。请注意,该徽章在PFE 10中已被弃用。我也不确定我们是否测试过它的菜单项?嘿,我尝试过使用
for
,但它似乎不起作用。@Melloware没有,它最初只对按钮起作用,但是我删除了这个限制,以便能够在头像上使用它。注意,如果你要移动到Primefaces 10,你应该使用PF核心徽章,而不是PFE徽章,因为它在10.0.1中被删除,因为PF有一个真正的徽章组件。