Medio ambiente:

  • Java 7
  • Jboss 5.2
  • Primefaces 6.2

El problema que tengo es que cuando hago clic en el elemento del menú, el comando no activa el método themeSwitcherBean.changeToOld. ¿Qué está mal?

MenuModel menu = new DefaultMenuModel();

Crear menú

...
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
Joe 14 oct. 2019 a las 15:17

1 respuesta

La mejor respuesta

Si establece una URL en una propiedad menuItem.url, es representado como un hipervínculo simple usando href. Al hacer clic en esto, el navegador navega a la URL dada y la solicita usando GET en lugar de hacer una solicitud POST opcionalmente usando AJAX. Esto finalmente no actualizará ": content" de la forma AJAX y no invocará su método de acción themeSwitcherBean.changeToNew.

Para que se invoque su método de acción, debe omitir esa línea :

menuItem.setUrl(subMenu.getServletPath());

Si encuentra que necesita volver a cargar toda la página (lo cual es probable cuando se cambia de tema) en lugar del elemento al que se hace referencia usando solo ": contenido", haga que su método de acción devuelva esa instrucción como String:

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

En este caso, puede deshabilitar AJAX en ese elemento de menú reduciendo un poco la sobrecarga de solicitud / respuesta / javaScript:

menuItem.setAjax(false);
2
Selaron 14 oct. 2019 a las 13:39