2012-01-05 20 views
17

Agregué el resources plug-in en una aplicación Grails 1.3.7 y todo funciona bien, excepto javascript que se carga de forma asíncrona.Grails Resources Plugin y AJAX loaded Javascript

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 me sale este error:

It looks like you are missing some calls to the r:layoutResources tag

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

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

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

Respuesta

18

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

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

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

+0

¡Información muy útil! Ya había buscado algo como esto en [docs] (http://grails.org/doc/latest/ref/Tags/render.html), pero la etiqueta de renderización no tiene ningún atributo de "diseño" a partir de 2.0. 3. –

+0

+1 muy útil para mí también. –

+0

sí, esto está funcionando – confile

4

Una mejor opción, creo que es no utilizar r: script en su fragmento de plantilla. Solo usa la etiqueta de script normal. No obtendrá ningún beneficio de los Recursos dentro de estos fragmentos si no necesita el material de layoutResources.

A veces la forma clásica es la mejor.

+2

Si uso la etiqueta de script clásica, en la carga de la página inicial, el código js no se ejecutará porque depende de las bibliotecas (jQuery, etc.) que se cargan en la parte inferior de la página (y no quiero cargarlas en la cabeza). – sikrip

+1

jQuery normalmente debe estar en disposición de cabeza y ejecutar primero de todos modos.Todas sus soluciones aquí serán bastante hacky porque está devolviendo efectivamente fragmentos de scripts dinámicos, que no es para lo que están diseñados los recursos. Parece que este enfoque te está causando algunos problemas, pero si deseas continuar con él, te sugiero que no uses las etiquetas de Recursos en el GSP principal que se sirve primero. –

1

Siempre respondo con Peter Ledbrook, pero en lugar de usar un diseño, uso una plantilla y automatizo lo que se debe renderizar en el diseño principal. Mi main.gsp tiene el siguiente aspecto:

<!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> 

A continuación, la plantilla _content.gsp parece:

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

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

+0

BTW Suelo usar mi propia función ajaxify para ajaxificar todos los enlaces relativos ... En caso de que alguien esté interesado: https://github.com/deigote/ajaxify/ – Deigote

Cuestiones relacionadas