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