Primefaces 2 MenuItem Action, ActionExpression или ActionListener - PullRequest
3 голосов
/ 06 февраля 2012

У меня есть существующая рабочая панель меню Primefaces 2 с элементами меню, определенными следующим образом:

<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 в базовый компонент следующим образом:

<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);, который, казалось, должен быть таким же, как атрибут action в XHTML, ищет arg как MethodBinding, который не рекомендуется.

menuItem.setActionExpression(arg) следующий наиболее вероятный, поскольку строка в XHTML является выражением EL #{cockpitMenuBean.displayCreateDialog}, но это просто возвращает строку.

menuItem.setActionListener(arg) устарело.

Я не соединяю точки при переходе от XHTML к компоненту поддержки при создании соответствующих пунктов меню.

Я пытался:

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);

И пункт меню отображается, но ничего не происходит, когда я выбираю его.

1 Ответ

3 голосов
/ 06 февраля 2012

Всякий раз, когда вы динамически создаете экземпляр UIInput или UICommand, вы должны присвоить компоненту фиксированный идентификатор. PrimeFaces MenuItem расширяется UICommand.

Итак, это должно сделать:

item1.setId("item1");
...