我的问题很简单。我使用 RichFaces 4.3.2 final 并以编程方式制作动态 panelMenu。我设法做到了,并对每个 UIPanelMenuGroup 和 UIPanelMenuItem 使用 setOnClick("menuGroupAction('"+labelOfGroup+"')")。labelOfGroup 因数据库中的项目而异。menuGroupAction 是 a4j:jsAction 用作:
<h:form>
<a4j:jsFunction name="menuGroupAction" actionListener="#{leftMenu.updateCurrent}" render=":contentForm:test" >
<a4j:param name="param1" />
</a4j:jsFunction>
</h:form>
问题是当我点击 TOP 子菜单param1
按预期更改时,但是当我尝试点击任何内部子菜单时,onclick 被触发但param1
其顶部菜单,即使内部子菜单有 onclick="menuGroupAction('itslabel')" . 知道为什么会这样吗?我正在检查发布的参数
String param1 = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param1");
另一件事是,当在任何子菜单中单击 UIMenuItem 时,实际上有两个 menuGroupAction 调用,一个带有 Top menu 的参数,另一个带有正确的 menuItem 参数。感谢您的回复,抱歉英语不好。
更新
这是我如何在页面上使用rich:panelMenu
<h:form>
<rich:panelMenu binding="#{leftMenu.menuCategories}" groupMode="ajax" itemMode="ajax" bubbleSelection="false" ></rich:panelMenu>
</h:form>
这里是 panelMenu 模型 menuCategories 的吸气剂
/**
* @return the menuCategories
*/
public UIPanelMenu getMenuCategories() {
if(menuCategories == null){
menuCategories = menuService.createCategoriesUIPanelMenu();
}
return menuCategories;
}
以及我如何创建 UIPanelMenu
public UIPanelMenu createCategoriesUIPanelMenu(){
List<Category> allTopCategories = catOper.getAllTopCategories();
int menulevel = 1;
sortByOrderOfCategories(allTopCategories);
UIPanelMenu categories = new UIPanelMenu();
categories.setTopGroupClass("button");
for (Category category : allTopCategories) {
UIPanelMenuGroup topMenuCategory = new UIPanelMenuGroup();
topMenuCategory.setLabel(category.getName());
topMenuCategory.setOnclick("menuGroupAction('"+category.getName()+"')");
rekursiveCategoriesMenuGroupSetter(topMenuCategory,category,menulevel);
categories.getChildren().add(topMenuCategory);
}
return categories;
}
private UIPanelMenuGroup rekursiveCategoriesMenuGroupSetter(UIPanelMenuGroup parent, Category category, int menuLevel){
int level = menuLevel+1;
List<Category> allTopCategories = (List<Category>) category.getCategoryCollection();
sortByOrderOfCategories(allTopCategories);
for (Category child : allTopCategories) {
if(!child.getCategoryCollection().isEmpty()){
UIPanelMenuGroup subGroup = new UIPanelMenuGroup();
subGroup.setLabel(child.getName());
subGroup.setLeftIconClass("menuLevel"+level);
subGroup.setOnclick("menuGroupAction('"+child.getName()+"')");
parent.getChildren().add(subGroup);
rekursiveCategoriesMenuGroupSetter(subGroup,child,level);
}
else{
UIPanelMenuItem item = new UIPanelMenuItem();
item.setLabel(child.getName());
item.setLeftIconClass("menuLevel"+level);
item.setOnclick("menuGroupAction('"+child.getName()+"')");
parent.getChildren().add(item);
}
}
return parent;
}
更新
奇怪的是,我在干净的页面上尝试了它并得到了一些有趣的消息。当设置默认 groupMode 又名“客户端”时,当单击某个内部组时,该操作有两个调用,一个具有顶部子菜单参数,一个具有正确的内部子菜单参数(与服务器相同),我想这是向前迈出的一小步与仅使用顶部子菜单调用相比。