Domanda

Ho una pagina JSF su cui voglio avere una casella di controllo che, se cliccato, aggiungere / rimuovere alcuni altri campi del modulo dalla pagina. Ecco il codice (semplificato) ho attualmente per la casella di controllo:

<h:selectBooleanCheckbox title="showComponentToReRender" value="#{backingBean.showComponentToReRender}">
    <a4j:support event="onsubmit" reRender="componentToReRender" />
</h:selectBooleanCheckbox>

Ecco il codice per la componente voglio nascondere:

<h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 &amp;&amp; backingBean.showComponentToReRender}">
   <s:selectItems value="#{valuesList}" var="value"/>
</h:selectOneMenu>

Al momento, cliccando sulla casella di controllo non fa nulla; che "selectOneMenu" non andrà via. Che cosa sto facendo di sbagliato?

È stato utile?

Soluzione

È necessario avvolgere il componentToReRender sia:

<h:panelGroup id="componentToReRenderWrapper">

o

<a4j:outputPanel id="componentToReRenderWrapper">

Quindi, di fatto si avrà:

<h:panelGroup id="componentToReRenderWrapper">
    <h:selectOneMenu id="componentToReRender" value="#{backingBean.value}" rendered="#{valuesList.rowCount>1 &amp;&amp; backingBean.showComponentToReRender}">
       <s:selectItems value="#{valuesList}" var="value"/>
    </h:selectOneMenu>
</h:panelGroup>

e cambiare la reRender="componentToReRenderWrapper" nel caso in cui si utilizza panelGroup, o rimuovere quell'attributo, nel caso in cui si utilizza outputPanel.

Trovato la spiegazione esatta nella RichFaces docs:

  

problema più comune con l'utilizzo di rerender punta al componente che ha un attributo "resa". Si noti, che JSF non segna il luogo nel browser DOM in cui il risultato del componente deve essere posto in caso in cui la condizione di "resa" restituisce false. Pertanto, dopo che il componente viene reso durante la richiesta Ajax, RichFaces trasporta il codice reso al cliente, ma non aggiorna una pagina, perché il luogo per l'aggiornamento è sconosciuto. Si deve puntare a uno dei componenti genitore che non ha alcun attributo "resa". In alternativa, si può avvolgere il componente con layout = "none".

Altri suggerimenti

Non dimenticare di impostare ajaxRendered = "true" sul a4j: outputPanel

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