Done: https://issues.apache.org/jira/browse/WICKET-5460
On Fri, Jan 3, 2014 at 10:16 PM, Sven Meier <s...@meiers.net> wrote: > This could be a bug. Could you create a quickstart please and attach it to a > JIRA issue? > > Many thanks > Sven > > > On 01/01/2014 07:38 PM, Martin Geisse wrote: >> >> Hi, >> >> thanks for the quick response. Just to be sure, I added code to detach >> the model after changing it, but nothing changed in behavior. In this >> case, LoadableDetachableModel only caches a *reference* to the >> underlying java.util.List, which is shared by all instances of the >> model class (it comes from a static variable). So it's expected that >> detaching does not change anything in this example, though in more >> realistic cases it would indeed be another way to cause a similar >> effect. Sorry for the confusion. >> >> The problem is, I think, not that the component is being marked as >> *rendered*, but as *prepared for render*. From class Component: >> >> protected void onBeforeRender() >> { >> setFlag(FLAG_PREPARED_FOR_RENDER, true); >> onBeforeRenderChildren(); >> setRequestFlag(RFLAG_BEFORE_RENDER_SUPER_CALL_VERIFIED, true); >> } >> >> Note the first line. This causes subsequent invocations of >> internalBeforeRender() to skip the relevant part. >> >> Greetings, >> Martin >> >> >> On Wed, Jan 1, 2014 at 6:33 PM, Sven Meier <s...@meiers.net> wrote: >>> >>> Hi, >>> >>> if I read its javadoc correctly, #internalPrepareForRender(false) should >>> not >>> mark the page as rendered (thus the false parameter). >>> >>> If your link modifies the ListView's model, it should call #detach() on >>> it. >>> Otherwise it will show stale data on next rendering. This doesn't have >>> anything to do with stateless pages, it is a general practice. >>> Can you verify whether this is the actual problem? >>> >>> Regards >>> Sven >>> >>> >>> On 01/01/2014 03:51 PM, Martin Geisse wrote: >>>> >>>> Hi, >>>> >>>> first of all, sorry for double-posting. It seems like I triggered some >>>> strange keyboard shortcut in Gmail before I was finished writing that >>>> mail... :( >>>> >>>> I'm having a problem with a ListView that displays an outdated list. >>>> In my test, the ListView uses a LoadableDetachableModel that "loads" >>>> from a static variable just to make sure the model is independent from >>>> any page instance. As far as I can tell, this problem has nothing to >>>> do with the model, but with the way Wicket prepares for a request >>>> listener invocation. >>>> >>>> The exact setup is this: >>>> - the page contains a ListView and (outside of the list) a Link that >>>> adds an item to the list in its onClick(). The list itself is stored >>>> in a static variable. >>>> - the page is stateless >>>> - the page's components are created in onInitialize() >>>> >>>> Result: >>>> The list doesn't show the most recently added item. Reloading the >>>> original page shows the correct list. Note that by "reloading" I mean >>>> entering the page's URL since the browser's address bar now contains >>>> the request listener URL due to the page being stateless. >>>> >>>> This is how I think is happens: >>>> - Initially rendering the page works fine. The page is then discarded >>>> since it's stateless. >>>> - Clicking on the link creates a new page instance to invoke the >>>> link's request listener. >>>> - IPageAndComponentProvider.getComponent() cannot find the link yet >>>> since it is not created until onInitialize() has been called. >>>> - as a consequence, it calls page.internalInitialize() and >>>> internalPrepareForRender(false) >>>> - this creates the link, but it also creates the ListView and prepares >>>> it for rendering. This in turn polls the ListView's model and creates >>>> list items. It also marks the ListView as "prepared for render", which >>>> is the crucial point. >>>> - The link's request listener runs and adds an item to the list. >>>> - After the request listener handler, the page render handler runs >>>> - That handler renders the page, including the ListView >>>> - ... but it doesn't call onBeforeRender() on the ListView anymore, >>>> because it's already marked as "prepared for render"! So it doesn't >>>> pick up the new, up-to-date list from its model. >>>> >>>> I'm not sure if I'm "doing it wrong", but then it doesn't seem quite >>>> right that onBeforeRender() gets called before invoking the listener, >>>> but not actually before rendering. There's probably some kind of logic >>>> behind the decision to run onBeforeRender() only when this hasn't yet >>>> happened, right? Is there a general way to "unprepare" the component >>>> in onClick()? >>>> >>>> Greetings, >>>> Martin >>>> >>>> --------------------------------------------------------------------- >>>> 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 >> > > > --------------------------------------------------------------------- > 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