2012-06-18 12 views
5

Ho un h: datatable che mostra un elenco di righe ei campi di ogni riga sono campi di input.Datable JSF: aggiunta e rimozione di righe di valori di righe chiare

mi rendono un pulsante "Aggiungi riga" prima della tabella, e un pulsante "Rimuovi riga" su ogni riga della tabella.

La cottura fagiolo è viewScoped, ed i pulsanti aggiungere/rimuovere elementi dall'elenco java nel backing bean, e poi tornare alla stessa vista.

I impostare l'attributo immediato "true" nei pulsanti per non convalidare i campi di inserimento quando aggiungo o rimuovere una riga.

Tutto funziona bene ma una cosa: i valori dei campi di input vengono cancellati. Ho pensato che la vista mantenesse i valori perché il bean è viewScoped.

Come posso ottenere l'aggiunta/rimozione di file senza innescare convalide e mantenendo i valori che sono stati già digitati dall'utente in forma?

mio punto di vista:

<h:form> 
    <h:commandButton value="Añadir Fila" immediate="true" action="#{tablaController.addRowAction}" /> 
    <h:dataTable value="#{tablaController.lista}" var="fila" cellpadding="0" cellspacing="0" border="1"> 
     <f:facet name="header">TABLA</f:facet> 
     <h:column> 
      <f:facet name="header"><h:outputLabel value="NOMBRE" /></f:facet> 
      <h:inputText id="nom" value="#{fila.nombre}" /> 
      <h:message for="nom" class="msjError" /> 
     </h:column> 
     <h:column> 
      <f:facet name="header"></f:facet> 
      <h:commandButton value="Quitar Fila" immediate="true" action="#{tablaController.removeRowAction(fila)}" /> 
     </h:column> 
    </h:dataTable> 
</h:form> 

mio supporto di fagioli:

@ManagedBean(name="tablaController") 
@ViewScoped 
public class TablaController { 

private List<Fila> lista; 
... 
public TablaController() { } 
... 
@PostConstruct 
public void init() { 
    this.lista = new ArrayList<Fila>(); 
    for (int i=0; i<5; i++) { 
     Fila fila = new Fila(); 
     fila.setNombre(""); 
     this.lista.add(i,fila); 
    } 
} 
... 
public String addRowAction() { 
    Fila fila = new Fila(); 
    fila.setNombre(""); 
    this.lista.add(fila); 
    return ""; 
} 

public String removeRowAction (Fila f) { 
    boolean exito = this.lista.remove(f); 
    return ""; 
} 
... 
} 

AGGIORNAMENTO -> La mia soluzione:

scrivo qui la mia soluzione, se qualcuno è interessato.

Il problema è che uso immediate = "true" per saltare le convalide, ma questo fa saltare anche update_model_values, in modo che i valori inseriti dall'utente nel modulo vengano persi dopo aver fatto clic sui pulsanti aggiungi/rimuovi -redenring della pagina.

Poiché utilizzo la "convalida del bean JSR-303", la mia soluzione era di saltare le convalide utilizzando f: validateBean per abilitarle/disabilitarle. A seconda del pulsante che faccio clic, se voglio eseguire le convalide, abilito la convalida del bean (ad esempio in un pulsante "invia"), e se voglio saltarle, disabilito la convalida del bean (come nell'aggiunta/rimozione pulsanti di riga). Ma comunque update_model_values ​​viene sempre eseguito, quindi i valori non vengono persi.

Ecco la vista:

<h:form> 
    <f:validateBean disabled="#{!empty param['disableValidation']}"> 
     <h:commandButton value="Añadir Fila" action="#{tablaController.addRowAction}"> 
      <f:param name="disableValidation" value="true" /> 
     </h:commandButton> 
     <h:dataTable value="#{tablaController.lista}" var="fila" cellpadding="0" cellspacing="0" border="1"> 
      <f:facet name="header">TABLA</f:facet> 
      <h:column> 
       <f:facet name="header"><h:outputLabel value="NOMBRE" /></f:facet> 
       <h:inputText id="nom" value="#{fila.nombre}" /> 
       <h:message for="nom" class="msjError" /> 
      </h:column> 
      <h:column> 
       <f:facet name="header"></f:facet> 
       <h:commandButton value="Quitar Fila" action="#{tablaController.removeRowAction(fila)}"> 
        <f:param name="disableValidation" value="true" /> 
       </h:commandButton> 
      </h:column> 
     </h:dataTable> 
     <h:commandButton value="Submit" action="#{tablaController.saveData}" /> 
    </f:validateBean> 
</h:form> 

Il supporto di fagioli:

@ManagedBean(name="tablaController") 
@ViewScoped 
public class TablaController { 

private List<Fila> lista; 
... 
public TablaController() { } 
... 
@PostConstruct 
public void init() { 
    this.lista = new ArrayList<Fila>(); 
    for (int i=0; i<5; i++) { 
     Fila fila = new Fila(); 
     fila.setNombre("fila "+i); 
     this.lista.add(i,fila); 
    } 
} 
... 
public String addRowAction() { 
    Fila fila = new Fila(); 
    fila.setNombre(""); 
    this.lista.add(fila); 
    return ""; 
} 

public String removeRowAction (Fila f) { 
    this.lista.remove(f); 
    return ""; 
} 
... 
public String saveData() { 
    ... 
    //processes the valid data 
    //for example, calls to a service method to store them in a database 
    ... 
    return ""; 
} 
... 
} 
+0

ciao ho lo stesso problema, buona soluzione. ma hai un'idea di come disabilitare i validatori built-in, come "required = true"? – wutzebaer

+2

Puoi inserire required = "# {empty param ['disableValidation']}". In questo modo il campo sarà richiesto o meno in base al pulsante su cui fai clic. Passare il parametro "disableValidation" se si desidera disabilitare l'attributo richiesto. – choquero70

+2

@ choquero70 Dovresti pubblicare la tua risposta separatamente. Non aggiungerlo alla domanda. In questo modo, sarà più facile per gli utenti SO analizzarlo e capirlo. –

risposta

0

Ho avuto esattamente lo stesso problema. In breve, NON puoi usare azioni immediate che aggiornino la tabella dei dati (UIData) o la ripetizione di facelet. Breve spiegazione: i valori inviati non vengono conservati per la ri-visualizzazione se gli input in UIData non passano attraverso la validazione. Lunga spiegazione può essere trovato qui: long explanation e a related bug in Mojarra

2

ho impostato l'attributo immediato su "true" nei pulsanti al fine di non convalidare i campi di input quando aggiungo o rimuovere una riga.

immediate="true" è lo strumento sbagliato per il lavoro. Deve essere utilizzato per la convalida prioritize, non per abilitare/disabilitare la convalida.La differenza è piuttosto grande quando ti incontri.

Si desidera attivare la convalida in modo condizionale. In caso di es. required="true" Sarebbe facile come

<h:inputText ... required="#{saveButtonPressed}" /> 

dove #{saveButtonPressed} valuta le true quando si preme il pulsante di salvataggio. Per esempio. quando il suo ID cliente è presente nella mappa dei parametri della richiesta.

In caso di JSR 303 convalida fagiolo, sarebbe una questione di

<f:validateBean disabled="#{not saveButtonPressed}"> 
    <h:inputText ... /> 
</f:validateBean> 

o con OmniFaces <o:validateBean> che permette il controllo che su una base per-comando.

<h:commandButton id="add" ...> 
    <o:validateBean disabled="true" /> 
</h:commandButton> 
Problemi correlati