Domanda

Sto usando JSF2.0 e sto costruendo un mago. Ho riscontrato un problema con SelectBooleanCheckbox. Ecco il flusso di lavoro:

  • Pagina di caricamento con caselle di controllo (i valori sono legati a una matifica nel fagiolo di supporto).
  • Spunteli e fai clic su Avanti. Ciò aumenta un cursore, che la pagina utilizza per determinare quale gruppo di pannelli è il carico.
  • I valori (corretti) sono persistiti sul fagiolo.
  • Fai clic su Back (il cursore viene decrementato) e la pagina rende le caselle di controllo modificabili. La prima casella di controllo non è spuntata (anche se la variabile vincolata ha un valore di true per quella casella).

Questo approccio basato sul cursore (che contiene tutti gli schermi della procedura guidata) non sembra funzionare. Tuttavia, se modifico leggermente questo in modo che i pulsanti prev/successivi facciano differenze diverse pagine XHTML, questo problema scompare.

Purtroppo non posso farlo. Colletteremo questa procedura guidata a una finestra di dialogo modale, quindi visitare una nuova pagina su Prev/Next non funzionerà

Ho scritto un piccolo esempio di questo (piuttosto che chiederti di guadare l'intero mago).

Ecco 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--;
    }
}

Ecco il frammento 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>

Eventuali suggerimenti sono benvenuti! (E mi dispiace se questo è un doppio post, non sono stato in grado di scoprire qualcosa di simile mentre cerco qui)

Nessuna soluzione corretta

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top