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

Reply via email to