Similitudes entre Grails y Tapestry
Grails template -> Un componente (tml) sin lógica de negocio (Tapestry)
Grails Taglib sin template -> Un componente con lógica de negocio que escribe la vista (Tapestry)
Grails Taglib que dentro invoca un template -> Un componente con vista y negocio mezclados (Tapestry)
Variable ${nombre} en una gsp: En grails busca la propiedad en el modelo enviado a la página, en tapestry busca la propiedad nombre
en el componente (.java).
En tapestry las expresiones ${}
buscan una propiedad dentro del componente de la página. Tapestry proporciona soporte para ajax a través de las zonas, una zona es un div que se refresca, la manera como funciona es la siguiente:
${}
dentro del div (se vuelven a invocar los métodos dentro del componente).Esta filosofía lleva a pensar que grails funciona igual, sin embargo funciona diferente:
En grails, definir la expresión ${nombre}
dentro de un div que se actualiza con ajax hace que al cargar la página busque la variable nombre
en el modelo de la página, sin embargo al lanzar la petición ajax el contenido del div updateMe
será sustituido por lo que retorne la acción formSubmit
.
<body>
<g:remoteLink action="formSubmit" update="updateMe">Ajax link</g:remoteLink>
<div id="updateMe">
aquí se va a actualizar el nombre: ${nombre}
</div>
</body>
El mismo comportamiento que tiene Tapestry puede ser simulado en Grails:
<body>
<g:remoteLink action="formSubmit" update="updateMe">Ajax link</g:remoteLink>
<div id="updateMe">
<g:render template="divcontent" model="[nombre: nombre]"/>
</div>
</body>
class TestController {
def index() {
render view: "index", model: [nombre:"carlos"]
}
def formSubmit() {
render template: "divcontent", model: [nombre: "otro ${Math.random()}"]
}
}
_divcontent:
aquí se va a actualizar el nombre: ${nombre}
El render del template divcontent
dentro del div updateMe
sirve para mostrar el contenido del template al cargar la página.
El render del template que retorna el método formSubmit()
sirve para refrescar el contenido del div cuando se lance la petición ajax.