2012-11-10 19 views
5

Il mio problema è che sto cercando di avere una colonna nel mio datatable show un outputtext per default, e sostituirlo con un inputtext quando si preme il pulsante command. Non ho trovato una soluzione. Primo post a proposito.a4j: commandButton reRendering rich: datatable

Ho un a4j: commandButton che sto cercando di rerender questa parte del mio dataTable

<a4j:commandButton reRender="yieldTable" action="#{yieldSearch.activateVisible()}" 
id="modify" styleClass="editLargeIcon" value="Modify"> 
</a4j:commandButton> 

<rich:dataTable id="yieldTable" value="#{yieldSearch.yfitem.yielditem}" var="_yield"> 
<rich:column> 
<f:facet name="header">%-YLD</f:facet> 
<h:outputText value="#{_yield.yfYield}" rendered="#{not yieldSearch.visible}"> 
</h:outputText> 
<h:inputText rendered="#{yieldSearch.visible}" /> 
</rich:column> 

e desidero attivare questo metodo (mostra solo codice rilevante)

@Name("yieldSearch") 
@Scope(ScopeType.CONVERSATION) 
public class YieldSearch implements Serializable{ 

private Boolean visible; 

public void activateVisible(){ 
    this.setVisible(true); 
    System.out.print(true); 
} 

    public void setVisible(Boolean visible) { 
    this.visible = visible; 
} 

public Boolean getVisible() { 
    return visible; 
} 

Qualsiasi aiuto molto apprezzato.

risposta

5

È necessario avvolgere entrambi i componenti in un <a4j:outputPanel id="myPanel" ajaxRendered="true"/>. Il motivo per cui entrambi i componenti non vengono restituiti è che il componente impostato su rendered="false" non verrà inviato al browser nel rendering della vista iniziale.

<a4j:outputPanel id="myPanel" ajaxRendered="true"> 
<h:outputText value="#{_yield.yfYield}" rendered="#{not yieldSearch.visible}"/> 
<h:inputText rendered="#{yieldSearch.visible}" /> 
</a4j:outputPanel> 

Il modo ajax aggiorna lavoro è usando javascript per individuare un clientId nell'albero DOM aggiornare con nuovo markup, cioè il componente deve essere già nell'albero DOM. Poiché hai impostato il valore rendered="false", il componente non è mai stato nella struttura del DOM per iniziare. Quindi, su una richiesta Ajax, il browser non sa di cosa stai parlando perché non riesce a trovare il clientId da aggiornare.

Utilizzando l'outputPanel con ajaxRendered="true", il gioco è rinfrescante l'intera outputPanel, quindi l'aggiornamento Ajax aggiornerà tale componente nel suo complesso, con tutto quello che hai inserito all'interno di questo

+1

In questo caso, il ' 'agirebbe come UIContainer, quindi il rendering della tabella di dati mostrerà/nasconderà' '/' 'di conseguenza. Sembra che OP non possa gestire lo scope di conversazione per questo caso. –