2

您好,我正在使用默认菜单模型从 ManagedBean 生成 Primefaces 菜单。这是我的代码。

菜单.xhtml

<h:form>
 <p:menu model="#{menuProvider.menuModel}"/>
</h:form>

MenuProvider.java

@ManagedBean
@SessionScoped
public class MenuProvider {

    MenuModel menuModel;
    MenuItem menuPage1,menuPage2,menuPage3,menuPage4;

    public MenuProvider() {

        menuModel = new DefaultMenuModel();

        ExpressionFactory factory = FacesContext.getCurrentInstance().getApplication().getExpressionFactory();
        MethodExpression methodExpression = factory.createMethodExpression(FacesContext.getCurrentInstance().getELContext(), "#{menuProvider.myAction('page1')}", Void.class, new Class[]{String.class});

        menuPage1 = new MenuItem();
        menuPage1.setValue("Page 1");
        menuPage1.setId("page1");
            menuPage1.setActionExpression(methodExpression);
        menuPage1.setUrl("/pages/page1.xhtml");//If i Remove this line then Action listener will work


        menuModel.addMenuItem(menuPage1);

        System.out.println("MenuModel() called");;
    }

    public MenuModel getMenuModel() {
        return menuModel;
    }

    public void setMenuModel(MenuModel menuModel) {
        this.menuModel = menuModel;
    }


    public void myAction(String ae)
    {
        System.out.println("Listener---");
        System.out.println(ae);
    }

}

我的问题是上面代码中的菜单项对象只有一个,
如果我删除 setUrl() 方法, setActionExpression() 将起作用。
如果我保留 serUrl() 方法, setActionExpression() 将不起作用。
有什么具体原因吗?还是我错过了什么。?

编辑我正在使用 Primefaces 3.5

4

1 回答 1

2

<p:menuitem>展示示例)的用法是双重的。基本上,据我所知,这两个用例都是互斥的,逻辑分析很好地支持了这一点。

<p:menuitem>充当普通的获取链接

在这个用例<p:menuitem>中,基本上是作为一个简单的导航链接,很像<h:link>ifoutcome被指定,或者<h:outputLink>ifurl被指定。您不能将侦听器附加到那种链接。基本上生成a带有指定的普通元素href

您希望在此类上下文中将其用于导航目的,以创建导航菜单。背诵展示示例:

<p:menu>  
    <p:submenu label="Navigations">  
        <p:menuitem value="External" url="http://www.primefaces.org" icon="ui-icon-home"/>  
        <p:menuitem value="Internal" outcome="/mobile/index" icon="ui-icon-star"/>  
    </p:submenu>  
</p:menu>  

<p:menuitem>作为执行业务活动的一种手段

在这个用例<p:menuitem>中,基本上充当了一个命令组件,它提交表单并执行业务操作,非常类似于<h:commandLink>/<h:commandButton>具有适当的actionactionlistener属性。您不能将您的网址附加到命令链接/按钮。它们基本上生成a通过 JavaScripthref="#"input type="submit".

您希望在这样的上下文中使用它来执行业务操作,并可能在需要时使用必要的导航发布一些数据。背诵展示示例:

<p:menu>  
    <p:submenu label="Ajax Menuitems">  
        <p:menuitem value="Save" actionListener="#{menuBean.save}" update="messages" icon="ui-icon-disk" />  
        <p:menuitem value="Update" actionListener="#{menuBean.update}" update="messages" icon="ui-icon-arrowrefresh-1-w"/>  
    </p:submenu>  
    <p:submenu label="Non-Ajax Menuitem">  
        <p:menuitem value="Delete" actionListener="#{menuBean.delete}" update="messages" ajax="false" icon="ui-icon-close"/>  
    </p:submenu>  
</p:menu>  

当您第一次使用它时,它会以某种方式令人困惑。但是当你尝试更深入地理解这类事情时,你会很容易掌握背后的逻辑,并<p:menuitem>相应地使用组件。

于 2013-05-08T10:34:16.670 回答