【问题标题】:Dynamic p:menu works in PrimeFaces 3.5, not in >4.0动态 p:menu 适用于 PrimeFaces 3.5,不适用于 >4.0
【发布时间】:2019-12-16 21:13:52
【问题描述】:

我正在将一个项目从 Primefaces 3.5 更新到 4.0,但我遇到了菜单问题。 我不明白如何动态创建一个像这样的简单菜单:

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

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

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

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

所以,基本上我需要将此代码从 pf 3.5 移植到 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());

没用

【问题讨论】:

  • 我在这里看不到任何“动态”的东西。 minimal reproducible example 请。为什么不直接升级到 6.2 或 7?有些“介于两者之间”的东西可能会让您回滚(例如,在 4 中删除但在 5 中再次添加,请参阅 PF 迁移文档)
  • 我简化了我的场景,菜单是从 db 迭代日期创建的。主要问题是如何从我的控制器对动作跳转进行编码。我认为有所有有用的输入,我还要添加什么?升级是对的,但此功能仅从 3.5 更改为 4.0
  • 在这种情况下,minimal reproducible example 将包含 minimal reproducible example 风格的工作 3.5 和非工作 4,0 变体。
  • 现在够了吗?抱歉,这是我第一次来这里,感谢您的帮助。

标签: primefaces menu menuitem


【解决方案1】:

只是对我自己,从过去开始,为了实现我的目标,我遵循了以下步骤:

  • 注册我自己的 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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-01-09
    • 2013-12-17
    • 2013-09-20
    • 2013-07-09
    • 1970-01-01
    • 2016-09-19
    • 2011-10-09
    • 2014-12-20
    • 2021-10-12
    相关资源
    最近更新 更多