动态Primefaces MenuItem不会触发命令

时间:2019-10-14 12:17:12

标签: jsf primefaces menu

环境:

  • Java 7
  • Jboss 5.2
  • Primefaces 6.2

我得到的问题是,当我单击菜单项时,该命令不会触发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>

1 个答案:

答案 0 :(得分:2)

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

要调用您的操作方法,您必须跳过该行

menuItem.setUrl(subMenu.getServletPath());

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

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

在这种情况下,您可以在该菜单项上禁用AJAX,从而减少请求/响应/ javaScript的开销:

menuItem.setAjax(false);