On Wed, Sep 7, 2011 at 11:35 AM, Sylvain Vieujot <svieu...@apache.org> wrote: > > 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)
suppose in your behavior you do panel1.replacewith(panel2) and panel2 has another stateless behavior. when that behavior fires and recreates the stateless page - this instance will not have panel2 so you will get an error. all these kinds of weird situations may creep up and they are hard to track. this is why our default behaviors are stateful by default, because most of the time that is what you want. there are some stateless behaviors out there, and a way for you to use them - its just not the model we support by default. -igor > > > 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 > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org For additional commands, e-mail: users-h...@wicket.apache.org