0

私の問題は簡単です。RichFaces 4.3.2 final を使用して、プログラムで動的な panelMenu を作成しています。私はなんとかそれを行い、setOnClick("menuGroupAction('"+labelOfGroup+"')") を各 UIPanelMenuGroup と UIPanelMenuItem に使用しました。labelOfGroup は、DB のアイテムによって異なります。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すると期待どおりに変化することですが、内部サブメニューをクリックしようとするとparam1、内部サブメニューに onclick="menuGroupAction('itslabel')" があるにもかかわらず、そのトップ メニューでonclick が起動されます。 . なぜそれが起こっているのですか?どのパラメーターが投稿されたかを確認しています

文字列 param1 = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("param1");

別のこととして、任意のサブメニューで UIMenuItem をクリックすると、実際には menuGroupAction が 2 回呼び出されます。返信ありがとうございます。英語が下手で申し訳ありません。

アップデート

ページでリッチ:パネルメニューを使用する方法は次のとおりです

<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 aka 'client' が設定されている場合、内部グループをクリックすると、そのアクションの 2 つの呼び出しがあり、1 つは最上位のサブメニュー パラメータを使用し、もう 1 つは innersubmenu の正しいパラメータを使用します (サーバーと同じ)。トップサブメニューでのみ呼び出す場合との比較。

4

0 に答える 0