2014-07-13 12 views
6

Ho preparato solo un semplice esempio di carrello per lo scopo solo dimostrativo.Salta l'elaborazione dei componenti di input all'interno di p: dataTable quando si preme un pulsante che ha solo bisogno di ottenere righe selezionate

La pagina XHTML:

<p:dataTable id="cartDataTable" value="#{testManagedBean.qtyList}" 
      var="cart" 
      selection="#{testManagedBean.selectedQtyList}" 
      rowKey="#{cart.id}"> 

    <p:column selectionMode="multiple" /> 

    <p:column> 
     <h:outputText value="#{cart.id}"/> 
    </p:column> 

    <p:column> 
     <p:inputText value="#{cart.qty}"/> 
    </p:column> 
</p:dataTable> 

<p:commandButton value="Delete" process="@this cartDataTable" 
       actionListener="#{testManagedBean.delete}"/> 

Il bean gestito:

@ManagedBean 
@SessionScoped 
public final class TestManagedBean implements Serializable 
{ 
    private List<Cart>qtyList; //Getter only. 
    private List<Cart>selectedQtyList; //Getter and setter. 
    private static final long serialVersionUID = 1L; 

    @PostConstruct 
    public void init() 
    { 
     qtyList=new ArrayList<>(); 
     qtyList.add(new Cart(1, 1)); 
     qtyList.add(new Cart(2, 1)); 
     qtyList.add(new Cart(3, 2)); 
     qtyList.add(new Cart(4, 1)); 
     qtyList.add(new Cart(5, 3)); 
    } 

    public void delete() 
    { 
     for(Cart cart:selectedQtyList) { 
      System.out.println(cart.getId()+" : "+cart.getQty()); 
     } 

     System.out.println("Perform deletion somehow."); 
    } 
} 

Si tratta di una sessione di ambito JSF bean gestito in possesso di un carrello della spesa. La classe Cart è piuttosto intuitiva con solo due proprietà di tipo Integer, ovvero id e qty e un costruttore con parametri.

Quando si fa clic sul pulsante di eliminazione specificato, è necessario impostare le righe selezionate da eliminare sul backing bean.

Per impostare le righe selezionate, l'attributo process di <p:commandButton> è impostato @this e cartDataTable che definisce le righe selezionate la struttura del bean selectedQtyList, premendo questo pulsante.

Da questa sessione scope fagiolo, se un inconsapevole utente modifica la quantità nel carrello in ogni riga/s prima di premere il tasto di cancellazione poi, nuovo valore/s di quantità è sono impostati/elencare qtyList.

Questo dovrebbe accadere solo quando si aggiorna il carrello ma di certo non deve succedere più durante l'eliminazione di una o più righe.

Nell'applicazione reale, la cancellazione viene eseguita in un bean con ambito separato.

Se l'attributo process di <p:commandButton> è impostato solo @this (cioè process="@this" rimozione cartDataTable da questo attributo) allora, righe selezionate non sono impostati alla proprietà bean gestito selectedQtyList.

Come procedere con questo?

+0

Se ho capito bene, puoi dare al tuo inputText uno styleClass di tua scelta, e quindi omettere i componenti con questa classe in process = "" con un selettore jQuery. Vedi la risposta di BalusC qui: http://stackoverflow.com/questions/12614882/how-to-exclude-child-component-in-ajax-update-of-a-parent-component/ –

+0

'' è all'interno di '' .È abbastanza improbabile che i suoi identificativi siano disponibili al di fuori di "" da escludere dall'elaborazione, quando viene fatto clic su "". – Tiny

+0

È possibile utilizzare l'attributo styleClass e funzionerà. Cosa è improbabile? –

risposta

5

Per quanto ho capito, in pratica si desidera impedire l'elaborazione di <p:inputText value="#{cart.qty}"> (aggiornamento del valore del modello) quando viene premuto il pulsante Elimina. In teoria, dovrebbe funzionare solo per specificare la colonna di selezione nell'attributo process, ma sfortunatamente lo <p:dataTable> non l'ha mangiato. Inoltre, il pulsante immediate="true" non sarà di aiuto in quanto lo <p:column selectionMode> non lo supporta.

La soluzione migliore è assicurarsi che l'attributo rendered del campo di input valuti solo true se il pulsante di eliminazione non viene premuto o quando JSF sta visualizzando la risposta.

<p:inputText ... rendered="#{empty param[delete.clientId] or facesContext.renderResponse}" /> 
... 
<p:commandButton binding="#{delete}" ... /> 

JSF cioè non elaborerà componenti di input che non sono resi. L'ambito del bean è irrilevante in questo caso.

+0

Funziona perfettamente bene. Grazie. – Tiny

+0

Prego. – BalusC