Почему мой Wicket Panel не обновляется после смены модели по умолчанию? - PullRequest
0 голосов
/ 11 апреля 2011

При первом отображении страницы с MessagePanel сообщение и ссылка для подтверждения отображаются идеально.Когда я нажимаю ссылку «Подтвердить», вся бизнес-логика работает, как нужно, метод getNextMessage() возвращает соответствующий объект, но панель сообщений не обновляется на странице в браузере.То есть метка тела сообщения не обновляется.

JPAEntityModel расширяет LoadableDetachableModel.

Чего мне не хватает?И как мне это исправить?

public class MessagePanel(String id, IModel<Message> messageModel) extends Panel {
  super(id, messageModel);
  add(new Label("messageText", new PropertyModel<Message>(getModelObject(), Message.BODY_FIELD)));
  add(new IndicatingAjaxFallbackLink<User>("approveLink", new JPAEntityModel<User> (getActiveUser())) {
    @Override
    public void onClick(AjaxRequestTarget target) {
      Message nextMessage = getNextMessage();
      MessagePanel.this.setDefaultModel(new JPAEntityModel<Message>(nextMessage));
      target.add(MessagePanel.this);
    }
});
  setOutputMarkupId(true);
}

Ответы [ 3 ]

4 голосов
/ 11 апреля 2011

Это потому, что вы не используете модель должным образом.

Эта строка принимает значение объекта модели панели, , заданное при построении , и использует его для созданиямодель компонента.

add(new Label("messageText", new PropertyModel<Message>(getModelObject(), Message.BODY_FIELD)));

Что еще хуже, когда вы нажимаете на ссылку, панели присваивается новая модель:

MessagePanel.this.setDefaultModel(new JPAEntityModel<Message>(nextMessage));

Но это, очевидно, не влияет на модельметки, так как она уже установлена ​​для ссылки на исходное значение.

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

new Model<Message>() {
  @Override
  public Message getObject() {
    return MessagePanel.this.getModelObject().getMessage(); //or something similar
  }
}

(Примечание: приведенный выше код не обязательно является лучшим решением, но это рабочее решение, которое демонстрирует, как модели могут использоваться динамически.)

И в идеале не следует заменять модель при нажатии на ссылку, просто измените объект модели.Если вам нужен собственный класс модели (JPAEntityModel), вам все равно не следует принимать предварительно созданную модель в конструкторе панели, а только первый объект сообщения.Причина в том, что текущая реализация не требует использования JPAEntityModel с самого начала, только после первого щелчка по ссылке.

0 голосов
/ 11 апреля 2011

Вы должны использовать вызов setOutputMarkupId(true) внутри вас MessagePanel. Панель должна иметь идентификатор разметки, чтобы иметь возможность обновлять DOM разметки в браузере.

0 голосов
/ 11 апреля 2011

Можете ли вы попробовать позвонить MessagePanel.this.modelChanged(), прежде чем добавить его к цели?

...