iberck
11/29/2016 - 3:12 AM

Grails databinding estático de List

Grails databinding estático de List

Grails databinding 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>