Martin

While this updates correctly, Im running in to a problem of state with
regards to visibility.  Is there anyway to preserve client side state
(specifically the value of 'display') when updating a component with such a
border wrapped around it?

Is there a way to inspect the value of the element attributes being
replaced before Wicket replaces the element in the DOM, and then after its
replaced the element set some attribute values back that were set
previously?

N


On Mon, May 12, 2014 at 8:06 AM, Nick Pratt <nbpr...@gmail.com> wrote:

> 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