Grails databinding estático de List
El siguiente ejemplo muestra cómo hacer databinding de propiedades dentro de una List
de objetos, a priori se sabe el número de elementos que se escribirán en la página (por ejemplo 4 Aeropuertos).
Controlador:
class TestController {
def index() {
render view: "index"
}
def formSubmit(AeropuertoCommand cmd) {
if (cmd.hasErrors()) {
render view: "index", model: [cmd: cmd]
return
}
log.debug("aeropuertos.command=$cmd")
render view: "index", model:[cmd: cmd]
}
}
@Validateable
@ToString
class AeropuertoCommand {
List<Aeropuerto> aeropuertos
static constraints = {
aeropuertos(validator: { aeropuertos ->
aeropuertos.every { it.validate() }
})
}
}
@Validateable
@ToString
class Aeropuerto {
String nombre
String direccion
static constraints = {
direccion minSize: 3
}
}
GSP:
<g:form action="formSubmit" class="form-horizontal">
<g:each in="${cmd?.aeropuertos}" status="i" var="it">
<g:hasErrors bean="${it}">
<div class="alert alert-danger">
Error en aerolinea: ${i+1}
<g:renderErrors bean="${it}" as="list"/>
</div>
</g:hasErrors>
</g:each>
Aerolinea 1:
<div class="form-group ${hasErrors(bean: cmd?.aeropuertos?.get(0), field: 'nombre', 'has-error')} has-feedback">
<label for="aeropuertos[0].nombre" class="control-label col-lg-2">
<span class="required-indicator">*</span> Nombre
</label>
<div class="col-lg-9">
<g:textField name="aeropuertos[0].nombre" class="form-control"
value="${fieldValue(bean: cmd?.aeropuertos?.get(0), field: "nombre")}"/><br/>
</div>
</div>
<div class="form-group ${hasErrors(bean: cmd?.aeropuertos?.get(0), field: 'direccion', 'has-error')} has-feedback">
<label for="aeropuertos[0].direccion" class="control-label col-lg-2">
<span class="required-indicator">*</span> Direccion
</label>
<div class="col-lg-9">
<g:textField name="aeropuertos[0].direccion" class="form-control"
value="${fieldValue(bean: cmd?.aeropuertos?.get(0), field: "direccion")}"/><br/>
</div>
</div>
Aerolinea 2:
<div class="form-group ${hasErrors(bean: cmd?.aeropuertos?.get(1), field: 'nombre', 'has-error')} has-feedback">
<label for="aeropuertos[1].nombre" class="control-label col-lg-2">
<span class="required-indicator">*</span> Nombre
</label>
<div class="col-lg-9">
<g:textField name="aeropuertos[1].nombre" class="form-control"
value="${fieldValue(bean: cmd?.aeropuertos?.get(1), field: "nombre")}"/><br/>
</div>
</div>
<div class="form-group ${hasErrors(bean: cmd?.aeropuertos?.get(1), field: 'direccion', 'has-error')} has-feedback">
<label for="aeropuertos[1].direccion" class="control-label col-lg-2">
<span class="required-indicator">*</span> Direccion
</label>
<div class="col-lg-9">
<g:textField name="aeropuertos[1].direccion" class="form-control"
value="${fieldValue(bean: cmd?.aeropuertos?.get(1), field: "direccion")}"/><br/>
</div>
</div>
<g:submitButton name="enviar"></g:submitButton>
</g:form>