动态 primefaces menuItem 不触发命令

Dynamic primefaces menuItem don't fire command

环境:

我遇到的问题是,当我单击菜单项时,命令不会触发 themeSwitcherBean.changeToOld 方法。怎么了?

MenuModel menu = new DefaultMenuModel();

创建菜单

...
for (Iterator<Menu> it = children.iterator(); it.hasNext(); ) {
    Menu subMenu = (Menu) it.next();

    String index = subMenu.getCodi();
    String element = rootCodi + index;

    DefaultMenuItem menuItem = new DefaultMenuItem(menuName);

    menuItem.setId(element);

    menuItem.setUrl(subMenu.getServletPath());
        menuItem.setCommand("#{themeSwitcherBean.changeToNew}");
    menuItem.setUpdate(":content");

    rootNode.addElement(menuItem);

}

menu.addElement(rootNode);
...

Menu.xhtml

<h:form id="frmMenu">
    <pu:menu model="#{sessionBean.menu}">
</h:form>

如果将 URL 设置为 menuItem.url 属性,则为 rendered as a simple hyperlink using href。 单击此按钮会导致浏览器导航到给定的 URL 并使用 GET 请求它,而不是选择性地使用 AJAX 执行 POST 请求。 这最终不会以 AJAX 方式更新“:content”,也不会调用您的 themeSwitcherBean.changeToNew 操作方法。

为了调用您的操作方法,您必须跳过该行:

menuItem.setUrl(subMenu.getServletPath());

如果您发现需要重新加载整个页面(这很可能在切换主题时)而不是仅使用“:content”引用的元素,请将您的操作方法 return 该指令设为 String:

public String changeToNew() {
    // do something ...
    // ...
    String viewId = FacesContext.getCurrentInstance().getViewRoot().getViewId();
    return viewId + "?faces-redirect=true&includeViewParams=true";
}

在这种情况下,您可以在该菜单项上禁用 AJAX,从而稍微减少 request/response/javaScript 开销:

menuItem.setAjax(false);