This works great - thank you.

Nick


On Sun, May 11, 2014 at 3:26 PM, Martin Grigorov <mgrigo...@apache.org>wrote:

> Hi,
>
> See org.apache.wicket.ajax.IAjaxRegionMarkupIdProvider
>
> Martin Grigorov
> Wicket Training and Consulting
>
>
> On Fri, May 9, 2014 at 9:34 PM, Nick Pratt <nbpr...@gmail.com> wrote:
>
> > I have a Behavior attached to a WebMarkupContainer with a bind() method
> as
> > follows:
> >
> > @Override
> > public void bind( Component component )
> >  {
> > this.boundComponent = component;
> >
> > component.setOutputMarkupId( true );
> >  component.setOutputMarkupPlaceholderTag( true );
> >
> >
> >
> //------------------------------------------------------------------------------------------------
> >
> >
> >
> //------------------------------------------------------------------------------------------------
> > component.add( new BorderBehaviour() );
> >
> >
> >
> //------------------------------------------------------------------------------------------------
> >
> >
> //------------------------------------------------------------------------------------------------
> >
> > this.borderMarkupId = component.getMarkupId() + "_brd";
> > }
> >
> > ....
> > ....
> > ....
> > class BorderBehaviour extends Behavior
> > {
> > @Override
> >  public void beforeRender( Component component )
> > {
> > Response response = component.getResponse();
> >
> > response.write( "<div id=\"" );
> > response.write( borderMarkupId ); // Generated from the bound component
> > above
> >  response.write( "\" class=\"popup\" style=\"display:none;\"><h1><span>"
> );
> > response.write( headerTextModel.getObject() );
> >  response.write( "</span><span class=\"close\"><a>X</a></span></h1>" );
> > }
> >
> > @Override
> > public void afterRender( Component component )
> > {
> >  component.getResponse().write( "</div>" );
> > }
> > }
> >
> >
> > When a page is initially loaded, beforeRender() and afterRender() get
> > executed just fine.  If the user hits the browser reload button,
> everything
> > still works (these two functions get executed).  However, during an Ajax
> > triggered event, I end up with duplicate markup being appended to the
> bound
> > component (since these two methods above run again, but the Component
> > hierarchy isn't re-generated, thus multiple copies of the additional
> markup
> > are written to the stream).
> >
> > I tried making the behavior temporary, and while that fixes the Ajax
> case,
> > it breaks in the "user-presses-reload-button" case - since the behavior,
> > now temporary, gets detached from the request after the initial render
> and
> > doesnt get rerun when the user requests a page that is already
> > generated/cached.
> >
> > How can I make this work for all three cases -
> > 1. Page load
> > 2. Page reload (same page ID)
> > 3. Ajax
> >
> > I noticed that the response in (3) is an AbstractAjaxResponse - is the
> only
> > way to fix this to run an instanceof check on the response type or is
> there
> > an alternate way?
> >
> > N
> >
>

Reply via email to