Question

J'utilise JSF2.0 et je construis un sorcier. J'ai rencontré un problème avec SelectBoolEanCheckboxes. Voici le workflow:

  • Page de chargement avec des cases à cocher (les valeurs sont liées à un triermap dans le haricot de support).
  • Cochez-les et cliquez sur Suivant. Cela incrémente un curseur, que la page utilise pour déterminer le groupe de panneau la charge.
  • Les valeurs (correctes) sont persistées au haricot.
  • Cliquez sur Retour (le curseur est décrémenté) et la page rend les cases modifiables. La première case à cocher n'est pas cochée (même si la variable liée contient une valeur de vrai pour cette case).

Cette approche basée sur le curseur (qui contient tous les écrans de l'assistant) ne semble pas fonctionner. Cependant, si je modifie légèrement cela afin que les boutons PREV / NEXT affichent différentes pages XHTML, ce problème disparaît.

Malheureusement, je ne peux pas faire ça. Nous allons brancher cet assistant dans une boîte de dialogue modale, donc visiter une nouvelle page sur PREV / NEXT ne fonctionnera pas

J'ai écrit un petit exemple de cela (plutôt que de vous demander de parcourir tout le sorcier).

Voici la classe Java:

@ConversationScoped
@Named("hashBool")
public class HashBoolTest2 implements Serializable {   

    private static final long serialVersionUID = 1962031429874426411L;

    @Inject private Conversation conversation;

    private List<RestrictionItem> list;
    private SortedMap<String, Boolean> values;

    private int cursor;

    public HashBoolTest2( ) {
        List<String> none = new ArrayList<String>();
        none.add("");

        this.setList( new ArrayList< RestrictionItem >( ) );
        this.getList().add( new RestrictionItem( "a", "a", none ) );
        ...
        this.getList().add( new RestrictionItem( "e", "e", none ) );

        this.setValues( new TreeMap< String, Boolean >() );

        this.setCursor( 0 );
    }

    @PostConstruct
    public void andThis() {
        this.conversation.begin( );
    }

    // getters and setters for instance variables

    @Override
    public String toString() {
        return "Values : " + this.values.toString( ) + " List: " + this.list.toString( );
    }

    public void kill() {
        this.conversation.end( );
    }

    public void doNext(ActionEvent e) {
        this.cursor++;
    }

    public void doPrev(ActionEvent e) {
        this.cursor--;
    }
}

Voici le fragment XHTML:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:ui="http://java.sun.com/jsf/facelets"
  xmlns:h="http://java.sun.com/jsf/html"
  xmlns:f="http://java.sun.com/jsf/core"
  xmlns:c="http://java.sun.com/jsp/jstl/core">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>IGNORED</title>
</head>
<body>
  <ui:composition>
    <h:panelGroup id="container">
      <h:form>
        <!-- edit state -->
        <h:panelGroup id="edit" rendered="#{hashBool.cursor eq 0}">
            <code>
              <h:outputText value="#{hashBool.toString()}" escape="false"/>
            </code>

            <ul>
              <ui:repeat value="#{hashBool.list}" var="elem">
                <li>
                  <h:selectBooleanCheckbox id="elem" value="#{hashBool.values[elem.id]}" title="#{elem.displayName}" />
                  <h:outputLabel for="elem" value="#{elem.displayName}"/>
                </li>
              </ui:repeat>
            </ul>
        </h:panelGroup>

        <!-- view state -->
        <h:panelGroup id="view" rendered="#{hashBool.cursor eq 1}">
          <code>
            <h:outputText value="#{hashBool.toString()}" escape="false"/>
          </code>
        </h:panelGroup>

        <br/>

        <!-- buttons -->
        <h:panelGroup id="buttons">
          <f:ajax render=":container">
            <h:commandButton value="Prev" actionListener="#{hashBool.doPrev}"/>
            <h:commandButton value="Next" actionListener="#{hashBool.doNext}"/>
          </f:ajax>
          <h:commandButton value="Kill" actionListener="#{hashBool.kill()}"/>
        </h:panelGroup>

      </h:form>
    </h:panelGroup>
  </ui:composition>
</body>
</html>

Toutes les suggestions sont les bienvenues! (Et désolé s'il s'agit d'un double post, je n'ai pas pu découvrir quelque chose de similaire pendant la recherche ici)

Pas de solution correcte

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top