I would say, don't take the DRY to extreme. This is a typical case
where you may need to do it in two seperate places. There are the has
js and no js situation one needs to handle.

I end up modify the ajax_tables example which scrapes the layout
generated from Kid then subsequently display the update with JSON. This
way, a js disabled brower still see the content as usual but the js
version just make the experience a bit better. The layout is still done
in Kid though I may add more things to the js side when the dojo kits
have better table/grid.

wavy davy wrote:
> Heya all.
>
> First post, cracking good framework, am much taken with it. It Does
> Things Right(TM). Props, Kevin et al.
>
> I have a question of best practice in TurboGears:
>
> I've got a method (Root.page()), w/kid template (page.kid) that spits
> out a full html document to the browser. I then want to update a
> section of that page using AJAX-funkyness. In my case I want to
> AJAX-update the contents of a table depending on user choices.
>
> AFAICS, the recomended way of doing this seems to be request a JSON
> data structure, then construct the table out of that in javascript. I
> don't like this because you have two seperate locations where you have
> to specify how to construct the table HTML, i.e. in the kid template
> and in the javascript (bye-bye DRY)
>
> I would prefer to use kid to do all my HTML generation ('cos its damn
> good at it, and 'cos javascript isn't). I think I want to be able to
> call a method via an AJAX request that returns the kid-generated HTML
> (as opposed to JSON), and swap this directly into the DOM.
>
> I can think of a few ways of doing this:
>
> a) specifying a ajax parameter flag on the AJAX call, and using
> tg_template in Root.page() to change the template to generate only be
> the part I want (i.e. the table). This requires an additional template
> with just the table in it, again breaking the DRY concept. You could
> use py:def/py:match to alleviate some repetition, but I don't like the
> idea of an extra one line file.
>
> b) using the AJAX request to grabbing the whole HTML document and using
> the DOM API to extract just the table part via id, and use that to
> update the live page. This seems a little clumsy and bandwidth
> inefficient, but requires no parameters or extra templates.
>
> c) have an extra method that returns just the table HTML. You could use
> this in the AJAX request, and you could also use it in the original
> Root.page() method
> and associated template.
>
> So far, I'm opting for c), but is there a better way to do it? Any
> thoughts?
> 
> -- 
> wavy davy

Reply via email to