On Wed, 2011-09-07 at 10:19 -0700, Igor Vaynberg wrote: > On Wed, Sep 7, 2011 at 10:11 AM, Sylvain Vieujot <svieu...@apache.org> 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.
But if the page is stateless you should not need the page id, just the page class to create a new instance isn't it ? (that is if the page's components ids are stable - see 2 below) > > 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. I agree that fixing the id is not a great idea ;-) But if the id generation could be stable for stateless pages, it would be quite helpful. My behaviour needs to repaint a component on a stateless page (which in the concept is like a stateless version of the clock example http://www.wicket-library.com/wicket-examples/ajax/clock ). In the Component id generation, couldn't we replace getSession().nextSequenceValue() by a new RequestCycle.get().nextSequenceValue() ( like the Page.getAutoIndex(), but we can not use the Page.getAutoIndex here as the page is not yet accessible) ? The ids would then be fixed for 2 instances of the same stateless page ? The ids would be much more stable and we could then have stable callback urls, i.e. stateless behaviours. Would this work ? > > -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 <svieu...@apache.org> 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: users-unsubscr...@wicket.apache.org > > For additional commands, e-mail: users-h...@wicket.apache.org > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > For additional commands, e-mail: users-h...@wicket.apache.org >
<<attachment: face-wink.png>>
signature.asc
Description: This is a digitally signed message part