2013-05-07 2 views
0

У меня возникла небольшая проблема с моим калиткой.Wicket RepeatingView refresh/rerender? Возможности? [Список элементов отсутствует]

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

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

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

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

Благодаря

EDIT:

Ниже Группа, которая держит 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); 

} 

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

Iam совершенно новый для калитки и, возможно, это моя проблема.

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

ответ

1

Это работает сейчас.

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

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

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

Проблема теперь: аутентификация, которая содержит объект пользователя, содержит объект OLD немодифицированного пользователя OLD. (Помните: я изменил группы пользователей.)

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

if (user is in group) { 

    addUnSubscribeLink(); 

} else { 

    addSubscribeLink(); 

} 

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

2

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

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

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

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

+0

Я добавил код – DaUser

3

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

Последний раз, когда у аналогичной проблемы был вопрос с DataTable, и это помогло.

+0

Подробнее здесь о LDM здесь -https: //cwiki.apache.org/WICKET/working-with-wicket-models.html#WorkingwithWicketmodels-DetachableModels –

1

Обычно я использую 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 возвращает правильно обновленный список.

Смежные вопросы