我有一个现有的Primefaces 2 MenuBar,其MenuItems定义如下:
<p:menubar style="width:625px" autoSubmenuDisplay="true">
<p:submenu label="#{messages.label_home}">
<p:menuitem value="#{messages.label_logout}" url="#" icon="ui-icon ui-icon-close"/>
</p:submenu>
<p:submenu label="#{messages.label_cockpit}">
<p:menuitem value="#{messages.label_create}" action="#{cockpitMenuBean.displayCreateDialog}" icon="ui-icon ui-icon-document" ajax="false"/>
<p:menuitem value="#{messages.label_list}" action="#{cockpitMenuBean.displayList}" icon="ui-icon ui-icon-folder-open" ajax="false"/>
</p:submenu>
我想将菜单模型从xhtml移到一个backingbean,如下所示:
<p:menubar style="width:625px" autoSubmenuDisplay="true" model="#{cockpitMenuBean.menuModel}"/>
问题和我的问题集中在上面的action
属性上。
CockpitMenuBean.displayCreateDialog()返回字符串
public String displayCreateDialog() {
cockpitMenu = new CockpitMenu();
createDialogVisible = true;
return "cockpitMenu";
}
menuItem.setAction(arg);
似乎应该与XHTML中的action
属性相同,但它正在寻找一个不推荐使用的MethodBinding
。
其次是menuItem.setActionExpression(arg)
,因为XHTML中的字符串是EL表达式#{cockpitMenuBean.displayCreateDialog}
,但它只返回一个string。
menuItem.setActionListener(arg)
已弃用。
在构建相应的菜单项时,我并没有将从XHTML移动到backingbean的过程中的点连接起来。
我试过了:
MenuItem item1 = new MenuItem();
item1.setValue("Should be first");
item1.setUrl("#");
MethodExpression aEx = expFact.createMethodExpression(elCtx, "#{cockpitMenuBean.displayCreateDialog}", String.class, new Class[0]);
item1.setActionExpression(aEx);
menuModel.addMenuItem(item1);
菜单项显示,但当我选择它时什么也没发生。
无论何时动态创建UIInput
或UICommand
的实例,都应该为组件提供一个固定的ID。PrimeFaces MenuItem
扩展了UICommand
。
所以,应该这样做:
item1.setId("item1");