I see. One option might be to include code in your "component.load" view
that makes use of the component's response.files, just like the code in
web2py_ajax.html. For example, in "component.load" include:
{{
for _k,_file in enumerate(response.files or []):
if _file in response.files[:_k]:
continue
_file0=_file.lower().split('?')[0]
if _file0.endswith('.css'):}}
<link href="{{=_file}}" rel="stylesheet" type="text/css" />{{
elif _file0.endswith('.js'):}}
<script src="{{=_file}}" type="text/javascript"></script>{{
pass
pass
}}
The above will link your component's css and js files in the component HTML,
which will be inserted in your 'index' page (give that you have ajax=False).
If you don't want to repeat that code in all your .load views, you can
probably create a function in a model file or module and just call the
function from your views.
Anthony
On Saturday, May 7, 2011 12:01:44 PM UTC-4, Iceberg wrote:
> Thank you Anthony for your comments and here comes my clarification.
>
> You are right that, adding response.files within a component, has no
> effect at all when called by "component.load". But I still keep a copy
> of those response.files inside the component, because they are needed
> when visiting "component.html" (during developing or debugging phase).
>
> On the other hand, when we have to copy those response.files in action
> "skeleton" or action "index", that does not feel elegant, because
> action "index" has to explicitly include some helper resources which
> not needed by itself. Imagine that, after I change implementation of
> "component" later, I have to modify "index" also. Grrr.
>
> Pbreit's suggestion is what I can do right now (thank you Pbreit too),
> it is DRY, but still not solving the unnecessary coupling mentioned
> above.
>
> Regards,
> Iceberg
>
>
> On May 7, 11:04 pm, Anthony <[email protected]> wrote:
> > Does adding to response.files within a component controller work at all?
> > With ajax=False, it looks like LOAD creates a new environment (and
> response)
> > to run the component controller, so I'm not sure appending to
> response.files
> > within a component controller will affect the response.files of the
> parent
> > controller.
> >
> > response.files is only used by web2py_ajax.html, which is typically
> included
> > in layout.html. Your index view probably extends layout.html, so
> > response.files added within the index controller will get included by
> > web2py_ajax.html. However, your component .load views probably do not
> extend
> > layout.html, so I would guess response.files added within component
> > controllers would be ignored.
> >
> > Haven't tried it, though, so I may be missing something.
> >
> > Anthony
> >
> >
> >
> >
> >
> >
> >
> > On Saturday, May 7, 2011 9:52:27 AM UTC-4, Iceberg wrote:
> > > Hi Massimo,
> >
> > > Can web2py support chaining response.files inside a component?
> >
> > > Scenario.
> >
> > > def component():
> > > response.files.extend([
> > > URL(..., 'fancy_helper1.js'),
> > > URL(..., 'fancy_helper2.js'),
> > > ......,
> > > URL(..., 'fancy_helper10.js'),
> > > ])
> > > return {'': 'Some fancy stuff'}
> >
> > > def skeleton():
> > > response.files.extend([
> > > URL(..., 'fancy_helper1.js'),
> > > URL(..., 'fancy_helper2.js'),
> > > ......,
> > > URL(..., 'fancy_helper10.js'),
> > > ]) # SAME AS THOSE IN component(). Can I omit this?
> > > return {'': LOAD('default', 'component.load', ajax=False)}
> >
> > > def index():
> > > response.files.extend([
> > > URL(..., 'fancy_helper1.js'),
> > > URL(..., 'fancy_helper2.js'),
> > > ......,
> > > URL(..., 'fancy_helper10.js'),
> > > ]) # SAME AS THOSE IN component(). Can I omit this?
> > > return {'': LOAD('default', 'skeleton.load', ajax=False)}
> >
> > > Currently, if I add one more helper_extra.js into my fancy
> > > component(), I needed to duplicate them into skeleton() and index().
> > > It is not DRY. Can it be improved?
> >
> > > Regards,
> > > Ray Luo (Iceberg)