Калитка RepeatingView обновляет/перерисовывает? Возможности? [Список отсутствующих элементов]

У меня возникла небольшая проблема с моим приложением калитки.

Проблема на странице под названием OverviewPage, вот некоторые панели, такие как ListPanel, в которых находится мой RepeatingView.

В этом RepeatingView (списке) есть несколько элементов с кнопкой для каждого элемента, если я нажму кнопку, я буду перенаправлен на другую страницу (RegistrationPage), и будут сделаны некоторые изменения в RepeatingView (список).

Если я теперь вернусь к обзорной странице с RepeatingView (списком), список будет точно таким же, как и раньше. Я внес изменения в элементы списка, но они не видны. (Я не нажимал кнопку возврата браузера, я щелкнул ссылку моей навигации)

Я знаю, что страницы калитки сохраняются в течение сеанса. Могу ли я указать калитке повторно отобразить эту страницу/список? какие есть возможности? может кто?

Спасибо

РЕДАКТИРОВАТЬ:

Ниже приведена панель, содержащая RepeatingView:

/**
 * 
 * Constructor...
 *
 * @param id
 */
public ServiceListPanel(String id) {

    super(id);

    RepeatingView repeating = new RepeatingView("repeating");
    add(repeating);

    int index = 0;

    // add all services to the list

    for (Service service : databaseService.getAllServices()) {

        AbstractItem item = new AbstractItem(repeating.newChildId());

        repeating.add(item);

        item.add(new ActionPanel("actions", new Model<Service>(service)));

        item.add(new Label("name", service.getName()));
        item.add(new Label("description", service.getDescription()));
        item.add(new Label("country", service.getCountry()));

        final int idx = index;
        item.add(AttributeModifier.replace("class", new AbstractReadOnlyModel<String>() {

            private static final long   serialVersionUID    = 1L;

            @Override
            public String getObject() {

                return (idx % 2 == 1) ? "even" : "odd";
            }
        }));

        index++;
    }

}

Следующим является ActionPanel, где должны произойти изменения:

/**
 * 
 * Constructor...
 *
 * @param id
 * @param model
 */
public ActionPanel(String id, final IModel<Service> model) {

    super(id);

    Link<?> link;

    ContextImage image;

    final ServiceUserDetails user = getSession().getUser();

    final Service service = model.getObject();

    // Check for groups and customize the link to subscribe or unsubscribe

    if (checkUserGroups(user, service)) {

        image = new ContextImage("img", "template/img/unsubscribe.gif");

        link = new Link<Void>("select") {

            /**  */
            private static final long   serialVersionUID    = -2153508505463870485L;

            /**
             * 
             * @see org.apache.wicket.markup.html.link.Link#onClick()
             */
            @Override
            public void onClick() {

                ServiceRequest req = new ServiceRequest(service, user, "DELETE");

                serviceProcessor.handleServiceRequest(req);

                setResponsePage(new RegistrationPage());



            }
        };

    } else { // user is not in group

        image = new ContextImage("img", "template/img/subscribe.gif");

        link = new Link<Void>("select") {

            /**  */
            private static final long   serialVersionUID    = -2153508505463870485L;

            /**
             * 
             * @see org.apache.wicket.markup.html.link.Link#onClick()
             */
            @Override
            public void onClick() {

                ServiceRequest req = new ServiceRequest(service, user, "PUT");

                serviceProcessor.handleServiceRequest(req);

                setResponsePage(new RegistrationPage());


            }
        };

    }

    link.add(image);

    add(link);

}

Как видите, единственное, что я хочу изменить, это одно изображение, изображение-ссылку. для подписки или отказа от подписки на услугу. элементы списка остаются прежними.

Я совершенно новичок в калитке, и, возможно, это моя проблема.

Надеюсь, теперь это лучше объяснено.


person DaUser    schedule 07.05.2013    source источник


Ответы (4)


Предоставьте вашей панели действий LoadableDetachableModel вместо обычного Model. LDM всегда извлекает новые свежие объекты, так что это может решить вашу проблему. Вероятно, вам придется немного реорганизовать свой код.

В прошлый раз была аналогичная проблема с DataTable, и это помогло.

person Robert Niestroj    schedule 07.05.2013
comment
Подробнее о LDM здесь - cwiki.apache.org /КАЛИТКА/ - person Gwyn Evans; 08.05.2013

Тут надо отличаться. Структура страницы/компонента строится один раз, а затем это дерево компонентов запрашивается для отображения для каждого отображения страницы (обновления). Некоторые повторители сохраняют список компонентов после процесса рендеринга, поэтому независимо от того, что вы делаете со списком (изменение элементов в нем), это не повлияет на результат рендеринга.

Другие повторители (RefreshingView) отбрасывают все компоненты после рендеринга и воссоздают компоненты для каждого процесса рендеринга, поэтому, если вы измените резервный список, эти изменения будут отражены в отображаемом выводе.

Кроме того, никакое состояние не сохраняется вне сеансов. Если сеанс закрыт, вы не можете вернуться к старому состоянию страницы.

Без некоторого кода я не могу сказать вам, почему вы видите старое состояние после нажатия на обратную ссылку.

person bert    schedule 07.05.2013

Обычно я использую ListView почти для всех своих повторителей, потому что это довольно просто. Чтобы вместо этого использовать ListView, я бы заменил следующие строки вашего кода (примечание: я пропустил некоторые строки, которые вы можете оставить на месте, и выделил databseService.getAllServices(), чтобы вы могли убедиться, что он действительно обновлен в этот момент):

RepeatingView repeating = new RepeatingView("repeating");
for (Service service : databaseService.getAllServices()) {
    AbstractItem item = new AbstractItem(repeating.newChildId());
    repeating.add(item);
    ...

С этим:

List<Service> serviceList = databaseService.getAllServices();
ListView repeating = new ListView("repeating", serviceList) {
    @Override
    protected void populateItem(ListItem item) {
        Service service = (Service) item.getModelObject();
        ...

После этого вы сможете использовать свои переменные товара и услуги так же, как и раньше. Кроме того, на этом этапе вы можете посмотреть с помощью регистратора или отладчика, чтобы убедиться, что ваш databaseService.getAllServices возвращает правильно обновленный список.

person OnesAndZeros    schedule 07.05.2013

Теперь это работает.

Это была моя ошибка. Список можно было бы обновить, НО не в моих условиях:

Я использовал SpringSecurity и Wicket в сочетании для аутентификации пользователя. Пользователь прошел аутентификацию через ldap в моем wicketSession. Аутентификация содержит объект пользователя со всем, что мне нужно (имя, sn, группы, электронная почта и т. д.).

В моем RepeatingView, точнее в моем ActionPanel, я сделал некоторые действия, чтобы изменить запись LDAP пользователя, добавив его в другие группы.

Теперь проблема заключается в следующем: аутентификация, которая содержит пользовательский объект, содержит СТАРЫЙ немодифицированный пользовательский объект. (Помните: я изменил группы пользователей.)

Вот почему я не видел никаких изменений в своих ListItems, мое состояние было похоже на...

if (user is in group) {

   addUnSubscribeLink(); 

} else {

   addSubscribeLink(); 

}

Спасибо за помощь в любом случае.

person DaUser    schedule 08.05.2013