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 "";
}
...
}
ciao ho lo stesso problema, buona soluzione. ma hai un'idea di come disabilitare i validatori built-in, come "required = true"? – wutzebaer
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
@ choquero70 Dovresti pubblicare la tua risposta separatamente. Non aggiungerlo alla domanda. In questo modo, sarà più facile per gli utenti SO analizzarlo e capirlo. –