动态 p:menu 适用于 PrimeFaces 3.5,而不适用于 >4.0 [英] Dynamic p:menu works in PrimeFaces 3.5, not in >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屋!