2016-03-07 10 views
8

Sto cercando di convertire il mio app per Asynchronous JavaScript carico con:Come faccio a caricare la pagina javascript dopo il caricamento asincrono del mio file manifesto

<%= javascript_include_tag "application", async: true %> 

Il problema è che gli script specifici della pagina vengono eseguiti prima Jquery viene caricato in modo asincrono. Come posso rimandare quelli fino a quando il file manifest di application.js è stato caricato.

Ho provato a racchiudere la mia pagina js in $(window).load(function(){}); ma questo non ha aiutato. Vedo ancora il seguente errore:

Uncaught ReferenceError: $ is not defined 

Aggiornamento:

Questo sembra funzionare per me, ma mi piacerebbe che qualcuno per confermare che sia l'approccio corretto:

<%= javascript_include_tag "application", async: true, onload: 'pageScripts()' %> 

Poi lo script della pagina come:

<script> 
    function pageScripts() { 
    // do something 
    } 
</script> 
+0

Perché non scrivere semplicemente il javascript all'interno di un ambito 'window.onload'? – jayant

risposta

10

tuo l'approccio è corretto tuttavia suggerirei di limitare l'Async solo per la produzione poiché nello sviluppo Sprockets non ha ancora concatenato tutti i file.

<%= javascript_include_tag "application", async: Rails.env.production?, onload: 'pageScripts()' %> 
+1

Grazie, ti darò il controllo dal momento che ti sei preoccupato di rispondere. BTW, puoi testarlo in sviluppo mettendo questo in development.rb 'config.assets.debug = false' .. questo forza il file manifest in modalità dev, ma generalmente è un'idea migliore fare' async: Rails.env. produzione? 'come hai suggerito. Grazie. – Abram

+0

qual è la differenza tra: async => true e async: Rails.env.production? ? –

+1

@KickButtowski la differenza è che quando ': async => true' sarà sempre Async, ma quando' async: Rails.env.production? 'Sarà asincrono solo quando è in produzione – SsouLlesS

Problemi correlati