javascript ajax grails grails-plugin

Grails Resources Plugin y javascript cargado de AJAX



grails-plugin (3)

Agregué el complemento de resources en una aplicación de Grails 1.3.7 y todo funciona bien, excepto javascript que se carga de forma asíncrona.

Así que si tengo una plantilla que contiene una

<r:script> // javascript here </r:script>

y cargarlo a través de ajax el código js no se ejecuta, y recibo este error:

Parece que faltan algunas llamadas a la etiqueta r: layoutResources

lo cual tiene sentido porque la página ya se ha renderizado y no hay r: layoutResources para manejar el código j: rs script recién agregado.

La única solución que he encontrado es agregar render r.layoutResources(disposition:"defer") después del render(template:...) real render(template:...) en las acciones del controlador que procesan el contenido de forma asíncrona.

¿Hay alguna otra solución más clara?


Creo que una opción mejor es no usar r: script en el fragmento de su plantilla. Solo usa la etiqueta de script normal. No está obteniendo ningún beneficio de los recursos dentro de estos fragmentos si no necesita las cosas de layoutResources.

A veces la forma clásica es la mejor.


Siempre voy con la respuesta de Peter Ledbrook, pero en lugar de usar un diseño, uso una plantilla y automatizo lo que se representa en el diseño principal. Mi main.gsp se parece a lo siguiente:

<!DOCTYPE html> <g:if test="${request.xhr}"> <g:render template="/layouts/content" /> </g:if> <g:else> <html> ... <!-- Main layout stuff: application resources, logo, main menu, etc --> <div id="content"> <!-- Somewhere in the body --> <g:render template="/layouts/content" /> </div> </html> </g:else>

Entonces, la plantilla _content.gsp se ve como:

<g:layoutBody /> <r:layoutResources disposition="defer"/> <!-- Ajaxify your relative links with the framework of your choice -->

De esa manera, puedo ajaxificar automáticamente todos los enlaces y formularios relativos y no se requiere ninguna acción en el controlador (no hay respuestas diferentes), ya que la respuesta ajax siempre va dentro del div de contenido.


Un mejor enfoque sería tener un diseño dedicado para sus respuestas AJAX:

<g:layoutBody/> <r:layoutResources disposition="defer"/>

Si está utilizando Grails 2.0, puede especificar el diseño en el método de render template: "...", layout: "ajax" ( render template: "...", layout: "ajax" ). De lo contrario, utilice el diseño por convención.