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



我正在将静态菜单重写为动态菜单,因为我们的客户希望动态更改菜单。在此之前,我有标准<p: 菜单>lt;p: 菜单项>lt/p: 菜单>结构。

但现在我已将其更改为:<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> 

那么,如何将<pe:badge>添加到bean中动态创建的菜单中呢?

我正在使用PrimeFaces 8

经过几个小时的测试和反复测试,我发现了一个问题,该问题使我无法将徽章添加到默认菜单项中。问题是当您尝试像这样将子项添加到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);

相关内容

  • 没有找到相关文章

最新更新