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

Reply via email to