如何使用 PrimeFaces 添加 pe:badge 到 bean 中动态创建的菜单
How to add pe:badge to dynamically created menu in bean using PrimeFaces
我正在将静态菜单重写为动态菜单,因为我们的客户希望即时动态更改菜单。在此之前,我的 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>
那么如何将 <pe:badge>
添加到 bean 中动态创建的菜单?
我正在使用 PrimeFaces 8
经过几个小时的测试和反复试验,我发现了阻止我将徽章添加到默认菜单项的问题。
问题是当您尝试像这样将 child 添加到 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);
我正在将静态菜单重写为动态菜单,因为我们的客户希望即时动态更改菜单。在此之前,我的 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>
那么如何将 <pe:badge>
添加到 bean 中动态创建的菜单?
我正在使用 PrimeFaces 8
经过几个小时的测试和反复试验,我发现了阻止我将徽章添加到默认菜单项的问题。
问题是当您尝试像这样将 child 添加到 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);