【发布时间】: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