动态 p:menu 适用于 PrimeFaces 3.5,而不适用于 >4.0 [英] Dynamic p:menu works in PrimeFaces 3.5, not in >4.0

查看:66
本文介绍了动态 p:menu 适用于 PrimeFaces 3.5,而不适用于 >4.0的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将一个项目从 Primefaces 3.5 更新到 4.0,但菜单出现问题.我无法理解如何动态创建这样的简单菜单:

I'm updating a project from Primefaces 3.5 to 4.0 and I've got problem with menu. I can't understand how to create dynamically a simple menu like this:

<p:menu>
    <p:submenu>
        <p:menuitem value="jump" action="myTransition" />
    </p:submenu>
</p:menu>

我尝试使用在我的 Spring Web 流配置中定义的转换名称来设置项目的命令,但没有结果.

I try to set the command of the item with the name of the transition, defined in my Spring web flow configuration, with no result.

DefaultMenuItem itemNone = new DefaultMenuItem();
item.setCommand("myTransition");

普通菜单工作正常,但如果我尝试动态菜单,页面只会刷新,没有错误或其他证据.

The plain menu work fine, but if I try the dynamic one the page just refresh, no errors or other evidence.

所以,基本上我需要移植这个代码,从 pf 3.5 到 pf >4.0

So, basically I need to port this code, from pf 3.5 to pf >4.0

for(String elem : list)
{
    MenuItem item = new MenuItem();
    item.setValue(elem.toUpperCase());
    item.setActionExpression(CommonUtils.createMethodExpressionInUIContext(FacesContext.getCurrentInstance(),  elem.replaceAll("\\s","").replace(".", ""),
                String.class, new Class[]{String.class}));
    submenu.getChildren().add(item);
}

有这个功能

public static MethodExpression createMethodExpressionInUIContext(final FacesContext facesContext, final String expression, Class<?> class1, Class[] classes) {

    FaceletContext faceletElContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
    MethodExpression methodExpression = FacesContext.getCurrentInstance().getApplication().getExpressionFactory()
            .createMethodExpression(faceletElContext, expression, class1, classes);

    return methodExpression;
}

我的尝试

DefaultMenuItem item = new DefaultMenuItem();    
item.setCommand(elem);

item.setCommand(CommonUtils.createMethodExpressionInUIContext(FacesContext.getCurrentInstance(),  elem.replaceAll("\\s","").replace(".", ""),String.class, new Class[]{String.class}).getExpressionString());

没用

推荐答案

就我自己而言,从过去,为了实现我的目标,我遵循了以下步骤:

Just to myself, from the past, to achieve my goal I followed these steps:

  • 注册我自己的 Menu 和 MenuRenderer,它扩展了 Primefaces 版本
  • 定义一个带有附加字段的新 MenuItem,用于操作命令(名为 commandAction)
  • 覆盖解码方法为:

菜单渲染器

@Override
public void decode(FacesContext context, UIComponent component) {
    AbstractMenu menu = (AbstractMenu) component;
    String clientId = menu.getClientId(context);
    Map<String, String> params = context.getExternalContext().getRequestParameterMap();

    if (params.containsKey(clientId)) {
        String menuid = params.get(clientId + "_menuid");
        DefaultMenuItem menuitem = (DefaultMenuItem) findMenuitem(menu.getElements(), menuid);
        MenuActionEvent event = new MenuActionEvent(menuitem, menuitem);

        // Action Listener
        if (StringUtils.isNoneBlank(menuitem.getCommand())) {
            menuitem.setActionExpression(CommonUtils.createMethodExpressionInUIContext(
                    FacesContext.getCurrentInstance(), menuitem.getCommand().replaceAll("\\s", "").replace(".", ""),
                    String.class, new Class[] { String.class }));

            if (menuitem.isImmediate()) {
                event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
            } else {
                event.setPhaseId(PhaseId.INVOKE_APPLICATION);
            }
            menu.queueEvent(event);
        }

        // Action
        if (StringUtils.isNoneBlank(menuitem.getCommandAction())) {
            menuitem.setActionExpression(CommonUtils.createMethodExpressionInUIContext(
                    FacesContext.getCurrentInstance(), menuitem.getCommandAction().replaceAll("\\s", "").replace(".", ""),
                    String.class, new Class[] { String.class }));

            if (menuitem.isImmediate()) {
                event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
            } else {
                event.setPhaseId(PhaseId.INVOKE_APPLICATION);
            }
            menu.queueEvent(event);
        }
    }
}

这篇关于动态 p:menu 适用于 PrimeFaces 3.5,而不适用于 >4.0的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆