2012-01-05 13 views
17

Ho aggiunto il plug-in resources in un'applicazione Grails 1.3.7 e tutto funziona bene tranne javascript che viene caricato in modo asincrono.Grails Resources Plugin e AJAX caricato javascript

Quindi, se ho un modello che contiene un

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

e caricarlo tramite ajax il codice js non viene eseguito, e ottengo questo errore:

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

che ha un senso in quanto il la pagina è già stata renderizzata e non esiste r: layoutResources per gestire il codice js di script r: appena aggiunto.

L'unica soluzione che ho trovato è quello di aggiungere render r.layoutResources(disposition:"defer")dopo l'attuale render(template:...) nelle azioni di controllo che rendono il contenuto in modo asincrono.

C'è qualche altra soluzione più chiara?

risposta

18

Un approccio migliore sarebbe quella di avere un layout dedicato per le vostre risposte AJAX:

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

Se stai usando Grails 2.0, è possibile specificare il layout nel metodo render (render template: "...", layout: "ajax"). Altrimenti, usa il layout per convenzione.

+0

Informazioni molto utili! Avevo già cercato qualcosa di simile in [docs] (http://grails.org/doc/latest/ref/Tags/render.html), ma il tag di rendering non ha attributo "layout" a partire da 2.0. 3. –

+0

+1 molto utile anche per me. –

+0

sì, funziona – confile

4

Un'opzione migliore, credo, non è utilizzare r: script nel frammento del modello. Basta usare il normale tag script. Non ottieni alcun beneficio dalle Risorse all'interno di questi frammenti se non hai bisogno delle risorse di layoutResources.

A volte il modo classico è il migliore.

+2

Se uso il classico tag script, nella pagina iniziale carica il codice js non verrà eseguito perché dipende dalle librerie (jQuery ecc.) Che vengono caricate nella parte inferiore della pagina (e non voglio caricarle in la testa). – sikrip

+1

jQuery dovrebbe normalmente essere in testa ed eseguire prima comunque.Tutte le tue soluzioni qui saranno piuttosto hacky perché stai effettivamente restituendo i frammenti di script dinamici, che non è quello per cui sono progettate le risorse. Sembra che questo approccio ti stia causando alcuni problemi, ma se desideri continuare con esso ti suggerirei di non utilizzare i tag Risorse nel GSP principale che viene inizialmente pubblicato. –

1

Vado sempre con la risposta di Peter Ledbrook, ma invece di utilizzare un layout, utilizzo un modello e automatizzo il rendering nel layout principale. Il mio main.gsp è simile al seguente:

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

Quindi, il modello _content.gsp assomiglia:

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

In questo modo, posso automaticamente ajaxify è richiesto a tutti i collegamenti relativi e le forme e nessuna azione nel controller (nessuna risposta diversa), poiché la risposta ajax va sempre all'interno del contenuto div.

+0

BTW Di solito vado con la mia funzione ajaxify per ajaxify tutti i collegamenti relativi ... Nel caso in cui qualcuno è interessato: https://github.com/deigote/ajaxify/ – Deigote

Problemi correlati