primefaces - 动态 p:menu 适用于 PrimeFaces 3.5,不适用于 >4.0
问题描述
我正在将一个项目从 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());
没用
解决方案
只是对我自己来说,从过去开始,为了实现我的目标,我遵循了以下步骤:
- 注册我自己的 Menu 和 MenuRenderer,扩展 Primefaces 版本
- 定义一个带有附加字段的新菜单项,用于操作命令(名为 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);
}
}
}
推荐阅读
- python - 诗歌1.1.11 | 找不到安装候选
- html - 将 html 文件链接到 arduino 强制门户草图
- ios - 滚动时清除 TableHeader,ImageView 变白[Swift]
- typescript - 在chartJS中获取数据
- opencv - OpenCV VideoCapture 如何确定 HLS 流的 CAP_PROP_FPS
- javascript - 反应相同的组件通信
- java - 为什么 Java 信任库在所有已安装的 JDK 版本中都相同?
- python - 在网络驱动器上复制并比较与 Windows 登录以获得许可
- javascript - 在带有数据表的闪亮应用程序中同时使用 Select 扩展和服务器端行选择
- javascript - 如何为使用地图制作的单个元素设置样式