I'm using LOAD functionality to break my webpage into bite-sized "cards" or 
"widgets" each of which is loaded separately when the page is called.  My 
overall website looks much like a "dashboard" with several of these widgets 
on a single page.

I'm trying to understand the LOAD process and how I can control the loading 
of Javascript snippets along with the HTML of the widget.  The Javascript 
added relies on other JS libraries already loaded -- only they aren't.  Yet.

My regular Javascript libraries (including jQuery, Datatables, etc.) are 
loaded at the end of the process, as usually recommended for better loading 
performance.  But the scripts loaded by LOAD are loaded before any of the 
standard Javascript libraries.  This causes JS idioms like "$(document)" to 
fail because "$" isn't defined yet.

I've created a thread-safe var called "scripts" and made it a list.  I 
added JS scripts to this list inside the LOAD template:

{{=body}}
{{
  xtra = current.scripts
  if isinstance(script,list):
    xtra.extend(xtra)
  else:
    xtra.append(xtra)
  pass
}}

(Apologies on the look of the fragment but we seem to have lost 
code-formatting ability in the latest "improvement" to Google Groups.)

Then at the end of my layout, I try to render these blocks at the end of 
the main view in layout.html:

  <!-- Extra scripts added at the end -->
  {{block extra_scripts}}
  {{
    for ea in current.scripts or []:
      =ea
    pass
  }}
  {{end extra_scripts}}

Surprisingly, this does not work as expected.  The page is rendered with 
all widgets and each Javascript segment is rendered along with the HTML of 
the widget -- NOT at the bottom of the page as commanded by the layout.html.

I'm mystified at how this occurs.  I could understand if layout.html is 
used at every invocation of LOAD, but that makes no sense whatever.  How 
would it "know" to skip all parts of layout.html except the script 
rendering part at the bottom?

If there's a better solution to my conundrum I'd like to know about it. 
 The goal again is to defer the scripts from a LOAD component until AFTER 
the main Javascript libraries are loaded.  I can't use response.files 
because these snippets are not *.js files, they are inline scripts.  They 
can't really be *.js files because they are dynamic and include 
customization for each widget individually.  So how to defer the scripts 
until after the response.files have been written?

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to web2py+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/web2py/4bd7d370-84bb-4d2c-9773-e7621cd0e4d8n%40googlegroups.com.

Reply via email to