Наследование разметки калитки не работает для тегов wicket:child в MarkupContainers

Я использую наследование разметки в Wicket 6.14.0 для создания простого виджет с заголовком и содержимым. Разметка родителя выглядит так:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket>
<wicket:panel>
<div wicket:id="widgetBox">
  <div wicket:id="widgetTitle"><wicket:enclosure child="icon"><span class="icon"><i wicket:id="icon"></i></span></wicket:enclosure>
    <h5 wicket:id="headline"></h5>
  </div>
  <div wicket:id="widgetContent"><wicket:child/></div>
</div>
</wicket:panel>
</html>

Его код довольно прост, но для полноты картины:

public class ParentPanel extends Panel {

        public ParentPanel(final String id, final IModel<String> title) {
            super(id, title);       

            WebMarkupContainer widgetBox = new WebMarkupContainer("widgetBox");         
            add(widgetBox);

            final WebMarkupContainer widgetTitle = new WebMarkupContainer("widgetTitle");           
            widgetBox.add(widgetTitle);

            final WebMarkupContainer icon = new WebMarkupContainer("icon");
            if (titleIcon != null) {
                // custom class
                icon.add(new IconBehavior("titleIcon"));
            } else {
                icon.setVisible(false);
            }
            widgetTitle.add(icon);
            widgetTitle.add(new Label("headline", title));

            widgetContent = new WebMarkupContainer("widgetContent");
            widgetContent.add(new WidgetContentBehavior());
            widgetBox.add(widgetContent);
        }
}

Теперь о дочернем компоненте. Вот его самая простая разметка:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket>
<wicket:extend>
  <span wicket:id="foobar"></span>
</wicket:extend>
</html>

И, конечно же, код Java:

public class ChildPanel extends ParentPanel {

    public ChildPanel(final String id, final IModel<String> title) {
        super(id, title);
        add(new Label("foobar", "Foobar"));
    }

}

То, что я ожидаю, конечно, это визуализированная страница с надписью «Foobar», где размещен тег wicket:child. Вместо этого есть это RuntimeException:

Last cause: Unable to find component with id 'foobar' in [TransparentWebMarkupContainer [Component id = wicket_extend3]]
    Expected: 'foobar:widgetBox:widgetContent:wicket_child2:wicket_extend3:foobar'.
    Found with similar names: 'foobar', foobar:foobar'

Кажется, что наследование разметки не поддерживает теги wicket:child внутри MarkupContainer и, следовательно, портит иерархию. Я также рассматривал возможность использования вместо этого Border, но получил тот же результат.

Мой вопрос, конечно, заключается в том, как получить эту работу, поддерживая текущую иерархию, поскольку важно иметь контроль (читай: объект Java) для widgetBox и widgetContent.


person msp    schedule 11.04.2014    source источник
comment
Без тестирования (не могу проверить прямо сейчас), я бы сказал, поскольку дочерний тег находится в вашем WebMarkupContainer, так же как и его содержимое. Таким образом, вы не можете просто добавить свою метку в панель, но должны добавить ее в свой объект widgetContent.   -  person Nicktar    schedule 11.04.2014
comment
@Nicktar, это то, что я пробовал в качестве обходного пути перед публикацией вопроса, это просто приводит к немного другому пути в том же исключении, поскольку он по-прежнему ожидает, что компонент дочернего элемента будет после :wicket_extend3:. Также было бы против идеи наследования разметки, если бы мне пришлось знать об иерархии родителя.   -  person msp    schedule 11.04.2014
comment
@Nicktar, но ты, конечно, прав. Я мог бы заставить это работать, используя границу сейчас, я дам ответ позже.   -  person msp    schedule 11.04.2014
comment
Я думаю, вы можете использовать TransparentWebMarkupContainer (вместо обычного). Прозрачный означает, что он не мешает иерархии компонентов (вы добавляете метку foobar непосредственно на страницу, а не в WebMarkupContainer).   -  person mrak    schedule 15.04.2014
comment
@mrak, использующий TransparentWebMarkupContainer как для widgetBox, так и для widgetContent, действительно решает проблему. Пожалуйста, добавьте в качестве ответа, и я приму это. Спасибо.   -  person msp    schedule 16.04.2014


Ответы (1)


Вот еще один вопрос, касающийся вашей проблемы: Can тег wicket:child должен быть вложен в другой компонент на странице?

В предоставленных ответах используется TransparentWebMarkupContainer для решения проблемы.

Однако я выяснил, что использование TransparentWebMarkupContainer не удастся, если ваша дочерняя страница определяет wicket:fragments. См. вопросы WICKET-4545 и WICKET-5440

person bernie    schedule 15.04.2014
comment
Вы уверены? Влияет на версию / версии: 1.5.6, OP использует 6.14.0. Кроме того, OP не использует TransparentWebMarkupContainer - это может быть проблемой. - person mrak; 16.04.2014
comment
У меня была такая же проблема с 6.12.0 (см. мой дубликат проблемы issues.apache.org/ jira/browse/WICKET-5440), так что я вполне уверен :) Но вы правы в том, что первоначальная проблема касается ветки 1.5. - person bernie; 16.04.2014