You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@wicket.apache.org by Alex Objelean <al...@isdc.ro> on 2007/07/31 10:06:37 UTC

Re: adding a listener to the AjaxRequestTarget


The OnLoadJavascriptBehavior below example works perfectly in wicket-1.2
branch. Is there a similar implementation for this in wicket-1.3?

Thank you!


igor.vaynberg wrote:
> 
> i agree its not seamless and can be improved on, perhaps you should open
> an
> rfe to have ajaxrequesttarget properly handle behaviors that implement
> iheadercontributor, but for now you can use the below (off the top of my
> head)
> 
> 
> class OnLoadJavasctiptBehavior extends AbstractBehavior implements
> IHeaderContributor {
>       private final IModel javascript;
> 
>       public OnLoadJavascriptBehavior(IModel javascript) {
> this.javascript=javascript; }
>       public void detachmodel() { javascript.detach(); }
> 
>      private boolean isajaxrequest() {
>              return RequestCycle.get().getRequestTarget instanceof
> AjaxRequestTarget; }
> 
>      // emit javascript into  header during regular render
>      void renderHead(IHeaderResponse response) {
>          if (!isajaxrequest()) {
>              response.writejavascript("registereevent(window, "load",
> "function() { "+javascript.getobject()+"}"));
>          }
>      }
> 
>     // emit javascript into ajax request target during ajax render
>     void onRendered() {
>        if (isajaxrequest()) {
>             AjaxRequestTarget t=RequestCycle.get().getRequestTarget();
>            t.appendjavascript(javascript.getobject());
>        }
>   }
> }
> 
> -igor
> 
> 
> 
> On 1/23/07, James McLaughlin <jo...@gmail.com> wrote:
>>
>> You're right, he is talking about something else :) Since you can add a
>> Behavior to multiple components, maybe Vincent can create a Behavior to
>> do
>> this. If he does this, then he can share my problem :)
>>
>> So back to my problem... I need something more than window.onload, I
>> think.
>> Wicket already has very sophisticated script block handling in
>> wicket-ajax
>> where the insertion order of script and other dom is preserved in the
>> evaluation order. It would be great if Behaviors could take advantage of
>> this, since they are the primary way of inserting script with wicket.
>> However, i think Behaviors were created pre wicket-ajax and are therefore
>> somewhat Page rendering centric in their design. window.onload is also
>> page
>> rendering specific. I'm talking about having Behaviors bridge the ajax
>> and
>> page rendering worlds through some form of adaptation. This way, if the
>> Behavior was Page rendered, it could add itself to the
>> window.onloadqueue,
>> if ajax rendered, it can put itself in the appropriate place in the xml
>> envelope and wicket-ajax takes care of the rest. The rest of wicket is
>> really seamless in its ajax/page rendering support, but this is one place
>> that isn't.
>>
>> thx,
>> jim
>>
>> On 1/23/07, Igor Vaynberg <ig...@gmail.com> wrote:
>> >
>> > i think he is talking about something a bit different
>> >
>> > what you want can be accomplished by using a bit of javascript foo
>> >
>> > http://ejohn.org/projects/flexible-javascript-events/
>> >
>> > you can use that func to register a bunch of window.onload events that
>> > execute once the html has been rendered. we were discussing about
>> > implementing that as part of wicket to have nice serverside api support
>> > for
>> > it, but havent had the time yet. matej?
>> >
>> > -igor
>> >
>> >
>> > On 1/23/07, James McLaughlin <jo...@gmail.com> wrote:
>> > >
>> > > I ran into this issue a while back and proposed an IOnLoadContributor
>> > > interface that kind of mirrors all the good work of
>> IHeaderContributor,
>> > > but
>> > > for script that is inserted anywhere below </head>, such as onload,
>> or
>> > > script blocks in the actual body.
>> > > http://www.nabble.com/rfc-OnLoadContributor-tf2609406.html#a7282114
>> > >
>> > > I'm getting around it now by having my Behaviors check the Target
>> type
>> > in
>> > > onRendered, which works great for Ajax requests. For non-ajax, you
>> need
>> > to
>> > > worry if the script block will end up in a place that isn't cool for
>> ie.
>> > >
>> > > On 1/23/07, Vincent Demay <vi...@anyware-tech.com> wrote:
>> > > >
>> > > > Hi all,
>> > > >
>> > > > When I re-render a Dojo widget via an ajaxRequestTarget, I have to
>> add
>> > > > some javascript to the request depending on which widget(component)
>> > has
>> > > > been added to the target. This javascript should be added in order
>> to
>> > > > re-parse new DojoWidget (from the ajax response) with dojo API.
>> This
>> > > > kind of parsing should only be done on top level Dojo component
>> > because
>> > > > during parsing sub-dojo-components will be automaticaly parsed.
>> > > >
>> > > > Actually what I need to do is  :
>> > > >
>> > > > before sending response
>> > > > 1 - looking for all component added to the target
>> > > > 2 - for all top-level Dojo components :
>> > > >        Adding its id to a map
>> > > > 3 - adding a js such as
>> > > >
>> > > > djConfig.searchIds =
>> ['id1','id2','id3'];dojo.hostenv.makeWidgets().
>> > > >
>> > > > My problem is I can not do a such stuff in a ajaxBehavior.respond
>> > > > because this should be done once by request and i do not have any
>> > access
>> > > > to the component list added to the target. On the other hand I can
>> not
>> > > > extends AjaxRequestTarget because If i do that I can not use
>> AjaxLink
>> > or
>> > > > other Ajax* to re-render a Dojo Component.
>> > > >
>> > > > So I thought to add a listener on AjaxRequestTarget that should be
>> > > > called after respondComponent in respondComponents method such as a
>> > > > IAjaxResponseListener with a onRender(Map/* <String,Component>
>> > > > */markupIdToComponent, AjaxRequestTarget target) method.
>> > > >
>> > > > Have you a better idea and WDYT about listener?
>> > > >
>> > > > thanks a lot
>> > > >
>> > > > --
>> > > > Vincent
>> > > >
>> > >
>> > >
>> >
>> >
>>
>>
> 
> 

-- 
View this message in context: http://www.nabble.com/adding-a-listener-to-the-AjaxRequestTarget-tf3065865.html#a11919892
Sent from the Wicket - Dev mailing list archive at Nabble.com.


Re: adding a listener to the AjaxRequestTarget

Posted by Igor Vaynberg <ig...@gmail.com>.
see iheadercontributor

-igor

On 7/31/07, Alex Objelean <al...@isdc.ro> wrote:
>
>
>
> The OnLoadJavascriptBehavior below example works perfectly in wicket-1.2
> branch. Is there a similar implementation for this in wicket-1.3?
>
> Thank you!
>
>
> igor.vaynberg wrote:
> >
> > i agree its not seamless and can be improved on, perhaps you should open
> > an
> > rfe to have ajaxrequesttarget properly handle behaviors that implement
> > iheadercontributor, but for now you can use the below (off the top of my
> > head)
> >
> >
> > class OnLoadJavasctiptBehavior extends AbstractBehavior implements
> > IHeaderContributor {
> >       private final IModel javascript;
> >
> >       public OnLoadJavascriptBehavior(IModel javascript) {
> > this.javascript=javascript; }
> >       public void detachmodel() { javascript.detach(); }
> >
> >      private boolean isajaxrequest() {
> >              return RequestCycle.get().getRequestTarget instanceof
> > AjaxRequestTarget; }
> >
> >      // emit javascript into  header during regular render
> >      void renderHead(IHeaderResponse response) {
> >          if (!isajaxrequest()) {
> >              response.writejavascript("registereevent(window, "load",
> > "function() { "+javascript.getobject()+"}"));
> >          }
> >      }
> >
> >     // emit javascript into ajax request target during ajax render
> >     void onRendered() {
> >        if (isajaxrequest()) {
> >             AjaxRequestTarget t=RequestCycle.get().getRequestTarget();
> >            t.appendjavascript(javascript.getobject());
> >        }
> >   }
> > }
> >
> > -igor
> >
> >
> >
> > On 1/23/07, James McLaughlin <jo...@gmail.com> wrote:
> >>
> >> You're right, he is talking about something else :) Since you can add a
> >> Behavior to multiple components, maybe Vincent can create a Behavior to
> >> do
> >> this. If he does this, then he can share my problem :)
> >>
> >> So back to my problem... I need something more than window.onload, I
> >> think.
> >> Wicket already has very sophisticated script block handling in
> >> wicket-ajax
> >> where the insertion order of script and other dom is preserved in the
> >> evaluation order. It would be great if Behaviors could take advantage
> of
> >> this, since they are the primary way of inserting script with wicket.
> >> However, i think Behaviors were created pre wicket-ajax and are
> therefore
> >> somewhat Page rendering centric in their design. window.onload is also
> >> page
> >> rendering specific. I'm talking about having Behaviors bridge the ajax
> >> and
> >> page rendering worlds through some form of adaptation. This way, if the
> >> Behavior was Page rendered, it could add itself to the
> >> window.onloadqueue,
> >> if ajax rendered, it can put itself in the appropriate place in the xml
> >> envelope and wicket-ajax takes care of the rest. The rest of wicket is
> >> really seamless in its ajax/page rendering support, but this is one
> place
> >> that isn't.
> >>
> >> thx,
> >> jim
> >>
> >> On 1/23/07, Igor Vaynberg <ig...@gmail.com> wrote:
> >> >
> >> > i think he is talking about something a bit different
> >> >
> >> > what you want can be accomplished by using a bit of javascript foo
> >> >
> >> > http://ejohn.org/projects/flexible-javascript-events/
> >> >
> >> > you can use that func to register a bunch of window.onload events
> that
> >> > execute once the html has been rendered. we were discussing about
> >> > implementing that as part of wicket to have nice serverside api
> support
> >> > for
> >> > it, but havent had the time yet. matej?
> >> >
> >> > -igor
> >> >
> >> >
> >> > On 1/23/07, James McLaughlin <jo...@gmail.com> wrote:
> >> > >
> >> > > I ran into this issue a while back and proposed an
> IOnLoadContributor
> >> > > interface that kind of mirrors all the good work of
> >> IHeaderContributor,
> >> > > but
> >> > > for script that is inserted anywhere below </head>, such as onload,
> >> or
> >> > > script blocks in the actual body.
> >> > > http://www.nabble.com/rfc-OnLoadContributor-tf2609406.html#a7282114
> >> > >
> >> > > I'm getting around it now by having my Behaviors check the Target
> >> type
> >> > in
> >> > > onRendered, which works great for Ajax requests. For non-ajax, you
> >> need
> >> > to
> >> > > worry if the script block will end up in a place that isn't cool
> for
> >> ie.
> >> > >
> >> > > On 1/23/07, Vincent Demay <vi...@anyware-tech.com> wrote:
> >> > > >
> >> > > > Hi all,
> >> > > >
> >> > > > When I re-render a Dojo widget via an ajaxRequestTarget, I have
> to
> >> add
> >> > > > some javascript to the request depending on which
> widget(component)
> >> > has
> >> > > > been added to the target. This javascript should be added in
> order
> >> to
> >> > > > re-parse new DojoWidget (from the ajax response) with dojo API.
> >> This
> >> > > > kind of parsing should only be done on top level Dojo component
> >> > because
> >> > > > during parsing sub-dojo-components will be automaticaly parsed.
> >> > > >
> >> > > > Actually what I need to do is  :
> >> > > >
> >> > > > before sending response
> >> > > > 1 - looking for all component added to the target
> >> > > > 2 - for all top-level Dojo components :
> >> > > >        Adding its id to a map
> >> > > > 3 - adding a js such as
> >> > > >
> >> > > > djConfig.searchIds =
> >> ['id1','id2','id3'];dojo.hostenv.makeWidgets().
> >> > > >
> >> > > > My problem is I can not do a such stuff in a ajaxBehavior.respond
> >> > > > because this should be done once by request and i do not have any
> >> > access
> >> > > > to the component list added to the target. On the other hand I
> can
> >> not
> >> > > > extends AjaxRequestTarget because If i do that I can not use
> >> AjaxLink
> >> > or
> >> > > > other Ajax* to re-render a Dojo Component.
> >> > > >
> >> > > > So I thought to add a listener on AjaxRequestTarget that should
> be
> >> > > > called after respondComponent in respondComponents method such as
> a
> >> > > > IAjaxResponseListener with a onRender(Map/* <String,Component>
> >> > > > */markupIdToComponent, AjaxRequestTarget target) method.
> >> > > >
> >> > > > Have you a better idea and WDYT about listener?
> >> > > >
> >> > > > thanks a lot
> >> > > >
> >> > > > --
> >> > > > Vincent
> >> > > >
> >> > >
> >> > >
> >> >
> >> >
> >>
> >>
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/adding-a-listener-to-the-AjaxRequestTarget-tf3065865.html#a11919892
> Sent from the Wicket - Dev mailing list archive at Nabble.com.
>
>