Как использовать BorderBehavior с рендерингом ajax - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу использовать BorderBehavior для добавления дополнительной разметки вокруг различных компонентов.

MyBorderBehavior extends BorderBehavior {

}

<wicket:border>
<div class="myBorderBehavior">
    <wicket:body />
    <!-- some more HTML code -->
</div>
</wicket:border>

Итак, в какой-то момент я добавляю новый компонент MyBorderBehavior к компоненту.

MyComponent myComponent = new MyComponent().add(new MyBorderBehavior());

Но когда я хочу обновить свой компонент через ajax

ajaxRequestTarget.add(myComponent)

HTML-разметка MyBorderBehavior отрисовывается снова, не удаляя уже существующую разметку MyBorderBehavior в DOM. В результате разметка MyBorderBehavior отображается в браузере дважды или чаще.

Как я могу добавить рамку к компоненту, который может быть повторно обработан с помощью ajax?

Рабочее решение, которое я нашел до сих пор, - это удалить разметку MyBorderbehavior вручную через JavaScript:

MyBorderBehavior extends BorderBehavior {
    @Override
    public void onComponentTag(Component component, ComponentTag tag) {
        super.onComponentTag(component, tag);

        IValueMap attributes = tag.getAttributes();
        attributes.put("class", attributes.getString("class", "") + " hasMyBorderbehavior");
    }
}

Wicket.Event.subscribe('/dom/node/removing', function(a, attributes, c, d, e) {
    var component = $('#' + attributes['id']);
    if (component.hasClass("hasMyBorderbehavior"))
    {
        component.closest(".myBorderBehavior").replaceWith(component);
    }
});

Но это, кажется, очень смешно.

На данный момент я нашел три случая, которые актуальны для меня:

  1. Компонент с BorderBehavior перерисовывается через ajax
  2. Родительский компонент компонента с BorderBehavior перерисовывается через ajax
  3. Перерисована вся страница

1 Ответ

0 голосов
/ 12 ноября 2018

Вы можете сделать свое поведение временным , и это позволит решить проблему при перерисовке с помощью Ajax, но может привести к поломке при повторной визуализации всей страницы.

Возможно, лучшим решением будет переопределить beforeRender BorderBehavior и ничего не делать, когда это Ajax-запрос:

@Override public void beforeRender(Component component) {
  if (!RequestCycle.get().find(AjaxRequestTarget.class).isPresent()) {
     super.beforeRender(component);
  }
}

То же самое для afterRender().

Код выше для Wicket 8.x, где RequestCycle.get().find(Class<T>) возвращает Optional<T>. Если вы используете более старую версию, вам нужно проверить null вместо: if (RequestCycle.get().find(AjaxRequestTarget.class) != null)

...