动态素面menuItem不触发命令

问题描述 投票:0回答:1

环境:

  • 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>
jsf primefaces menu
1个回答
0
投票

如果将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);
© www.soinside.com 2019 - 2024. All rights reserved.