On Wed, Sep 7, 2011 at 10:11 AM, Sylvain Vieujot <[email protected]> wrote:
> I looked at this code, but it does not really help as it has to bind to an
> event, whilst I am trying to do an auto update component.
>
> I have 2 questions :
>
> 1) Why does the AbstractAjaxBehavior sets the getStatelessHint to false ?
> It seems to me that this "non stateless" hint could be set much lower in the
> classe hierarchy, but I must be missing something.

because the behavior itself is stateful. it needs to generate a
callback url to a component, which means it needs a page id - which
means the page has to exist already - which means it cannot be
stateless. it works much the same way as a Link component.

> 2) The main problem I have is in the component's id generation.
> In Component.getMarkupId, line 1505, we have :
>     final int generatedMarkupId = storedMarkupId instanceof Integer ?
> (Integer)storedMarkupId
> : getSession().nextSequenceValue();
> So on every request, the id changes because of the
> getSession().nextSequenceValue().
> If in the Behaviour's onBind method, the component's id is fixed, then I
> have no problem ... except this is not very clean programming!

if you fix the id yourself you have no way to guarantee it is unique.
eg if this is a panel you can have two instances of the panel in the
page, etc. the id itself should not matter much as long as you repaint
the component so its markup id changes to the new value.

-igor


>
> public class StatelessAjaxTimerBehavior extends
> AjaxSelfUpdatingTimerBehavior {
>
> public StatelessAjaxTimerBehavior(Duration updateInterval) {
> super( updateInterval );
> }
>
> @Override
> public boolean getStatelessHint(@SuppressWarnings( "unused" ) Component
> component) {
> return true;
> }
>
> @Override
> protected void onBind() {
> getComponent().setMarkupId( "myForcedID" ); // FIXME: This works, but is not
> very clean ... to say the least
> super.onBind();
> }
> }
>
> Is there a recommended way to fix this ?
>
> Thank you,
>
> Sylvain.
>
> On Wed, 2011-09-07 at 08:34 -0700, Igor Vaynberg wrote:
>
> use something like this [1] as a base and build your own timer behavior
>
> [1]
> https://github.com/jolira/wicket-stateless/blob/master/stateless/src/main/java/com/google/code/joliratools/StatelessAjaxEventBehavior.java
>
> -igor
>
>
> On Wed, Sep 7, 2011 at 3:36 AM, Sylvain Vieujot <[email protected]> wrote:
>> Hello,
>>
>> I have a stateless page, and I would like to periodically refresh a
>> section
>> of this page.
>> If I do :
>>
>> add( new MyPanel( "header" )
>>         .setOutputMarkupId( true )
>>         .add( new AjaxSelfUpdatingTimerBehavior( Duration.minutes( 2 ) )
>>       );
>>
>> The page becomes stateless.
>>
>> If in MyPanel, I have :
>> class MyPanel{
>>      ...
>>      @Override
>>      public boolean getStatelessHint(@SuppressWarnings( "unused" )
>> Component
>> component) {
>>           return true;
>>      }
>>      ...
>> }
>>
>> The update does not work as the expected component's HTML id does not
>> remain
>> constant :
>>
>> Wicket.Ajax: Wicket.Ajax.Call.processComponent: Component with id
>> [[header2]] was not found while trying to perform markup update. Make sure
>> you called component.setOutputMarkupId(
> true) on the component whose markup
>> you are trying to update. console.error('Wicket.Ajax: ' + msg);
>> I also tried to use .setVersioned( false ) on both the component and the
>> page, but without success.
>> Is there a way to do this ?
>>
>> Thank you,
>>
>> Sylvain.
>
> ---------------------------------------------------------------------
> 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]

Reply via email to