Primefaces 2 MenuItem Action, ActionExpression or ActionList



我有一个现有的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);

菜单项显示,但当我选择它时什么也没发生。

无论何时动态创建UIInputUICommand的实例,都应该为组件提供一个固定的ID。PrimeFaces MenuItem扩展了UICommand

所以,应该这样做:

item1.setId("item1");