RichFaces a4j.jsFunction的奇怪行为

RichFaces a4j.jsFunction的奇怪行为,jsf,richfaces,Jsf,Richfaces,我的问题很简单。我正在使用RichFaces 4.3.2 final并制作程序化动态面板菜单。我成功地做到了这一点,并对每个UIPanelMenuGroup和UIPanelMenuItem使用setOnClick(“menuGroupAction(““+labelOfGroup+”)”)。labelOfGroup因数据库中的项目而异。menuGroupAction是a4j:jsAction,用作: <h:form> <a4j:jsFunction name="menuG

我的问题很简单。我正在使用RichFaces 4.3.2 final并制作程序化动态面板菜单。我成功地做到了这一点,并对每个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>
下面是panelMenu模型菜单类别的getter

 /**
 * @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;

}
public UIPanelMenu createCategoriesUIPanelMenu(){
List allTopCategories=catOper.getAllTopCategories();
int menulevel=1;
SortBylderofCategories(所有TopCategories);
UIPanelMenu categories=新建UIPanelMenu();
类别。setTopGroupClass(“按钮”);
对于(类别:allTopCategories){
UIPanelMenuGroup topMenuCategory=新建UIPanelMenuGroup();
topMenuCategory.setLabel(category.getName());
topMenuCategory.setOnclick(“menuGroupAction('“+category.getName()+”)”);
RekursiveCategoriesNuGroupSetter(topMenuCategory,category,menulevel);
categories.getChildren().add(topMenuCategory);
}
退货类别;
}
专用UIPanelMenuGroup RekursiveCategoriesNuGroupSetter(UIPanelMenuGroup父级、类别类别、int menuLevel){
int level=menuLevel+1;
List allTopCategories=(List)category.GetCategoricCollection();
SortBylderofCategories(所有TopCategories);
对于(类别子项:allTopCategories){
如果(!child.getCategoryCollection().isEmpty()){
UIPanelMenuGroup子组=新建UIPanelMenuGroup();
setLabel(child.getName());
子组setLeftIconClass(“菜单级别”+级别);
setOnclick(“menuGroupAction(“+child.getName()+”)”);
parent.getChildren().add(子组);
rekursiveCategoriesMenuGroupSetter(子组、子组、级别);
}
否则{
UIPanelMenuItem项=新建UIPanelMenuItem();
item.setLabel(child.getName());
item.setLeftIconClass(“菜单级别”+级别);
item.setOnclick(“menuGroupAction(“+child.getName()+”)”);
parent.getChildren().add(项);
}
}
返回父母;
}
更新


奇怪的是,我在干净的页面上试了一下,得到了一些有趣的消息。当设置默认groupMode(也称为“客户端”)时,当单击某个内部组时,该操作有两个调用,一个调用顶部子菜单参数,另一个调用内部子菜单的正确参数(与服务器相同),与仅使用顶部子菜单调用相比,我认为这是向前迈出了一小步。

这看起来像是事件冒泡的问题-请发布用于添加运行
菜单组操作的单击侦听器的代码。更新了问题,现在您可以看到整个代码。我建议快速检查:add
return false
setOnclick
方法调用(例如
topMenuCategory.setOnclick(“menuGroupAction(“+”).getName()+”);return false;”);
并查看这对行为的影响。与之前一样,单击menuitem会导致两个onclick调用,首先使用正确的参数(菜单项的标签)然后,使用top UIPanelMenuGroup的参数再次单击内部UIPanelMenuGroup,导致使用top的参数再次单击调用submenu@PájaJirásek为了隔离问题,您是否验证了生成的源代码(即:生成的HTML)要确保javascript函数
menuGroupAction
的参数对于儿童来说确实不同?
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;

}