I'm not an expert on this, but I can offer you a real need for defer().
Suppose you have a mixin that attaches some trivial piece of JavaScript
to components that use it; for example, a key logger. As far as the JS,
what you need to do is register a few DOM event handlers on an element -
probably onkeypress or onkeyup, etc. Let's suppose you wrote a class
that creates such objects, and all you need to instantiate them is the
DOM id of the element.
In a simple case all you'd need to do is have your mixin include the
javascript and provide a line (like support.addScript()) to instantiate
the object in JS code - providing the component id, which I think you
can get through something like ComponentResources. Now, if in your
template code you have one component for which you explicitly provide
the DOM id, then your mixin will end up with this id. However there are
situations where you simply can't know the id before hand, and in such
cases you must rely on Tapestry to provide it.
A classic example is looping. If you have a loop that for some reason
creates a variable number of components, to which you'd like to attach
instances of your JS key logger, then you need to get the ids (created
on the fly) from Tapestry. What's more, you can't assk a component for
its id until it has already been assigned one, and the only way to be
sure that your code executes after the assignment happen is to use
Heartbeat#defer.
Now as far as when a heartbeat is created, and when/who must call
start() and end(), I'm not entirely sure. I think that a component whose
behavior interacts with/depends on that of other components/mixins must
use heartbeats to coordinate.
I hope this helps. I'd suggest looking into the source for heartbeat's
implementation as well as what really happens inside form support's
defer method. You're not alone in your questions and expanded docs on
this would be helpful.
sincerely,
chris
PS - irc.freenode.net #tapestry
Michael Courcy wrote:
Gabriel Landais a écrit :
Michael Courcy a écrit :
If you look at this exemple : TreeGridComponent
http://tapestry5-treegrid.googlecode.com/svn/trunk/tapestry5-treegrid/src/main/java/org/codelutin/tapestry/components/TreeGrid.java
a hearbeat.begin is called in beginRender and heartbeat.end is
called in afterRender but you can never read a call to defer, so can
you explain why the author of this component call begin and end ? I
really can't explain myself.
I've based my component on
<http://wiki.apache.org/tapestry/Tapestry5HowToCreateYourOwnComponents>
and <http://wiki.apache.org/tapestry/Tapestry5TreeComponent> without
really understanding how it heartbeat works... As I don't use defer,
I don't even know if it is useful...
Gabriel
But do you see a different hehaviour if you remove this two lines ?
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]