Как я могу предсказать, какие компоненты Wicket будут отображать свои теги на последней странице? - PullRequest
0 голосов
/ 01 июля 2011

Для некоторых компонентов Wicket, если я вызываю setOutputMarkupId(true), они предупреждают, когда они отображаются.

Markup id set on a component that is usually not rendered into markup.

Я хотел бы вывести идентификатор для каждого компонента, который фактически окажется в HTML вчтобы я мог найти их с XPath для тестирования.Как я могу предсказать из класса или свойств Component, является ли это разумным для setOutputMarkupId(true)?


Более подробно - в моем Application я переопределяю

protected void init() {
    super.init();
    addComponentInstantiationListener(new IComponentInstantiationListener() {
        public void onInstantiation(Component component) {
            if (!(component instanceof WebMarkupContainer)) return;
            if (component instanceof WebMarkupContainerWithAssociatedMarkup) return;
            if (component instanceof Border.BorderBodyContainer) return;
            WebMarkupContainer container = (WebMarkupContainer) component;
            if (container.isTransparentResolver()) return;

            component.setOutputMarkupId(true);
        }});

Для примера страниц этот произвольный Губбинс делает свое дело, но он кажется довольно произвольным!

Ответы [ 3 ]

1 голос
/ 03 июля 2011

Также игнорируйте автокомпоненты (Component.isAuto ()).Такими компонентами являются, например: <wicket:container>, <wicket:enclosure> и т. Д.

1 голос
/ 14 августа 2012

Это всего лишь идея. Я не пробовал этого и не могу сейчас ...

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

Это можно сделать так:

boolean isGoingToBeRendered (Component component) {
    MarkupStream stream = new MarkupStream(component.getMarkup());
    ComponentTag tag = stream.getTag();
    return (!tag instanceof WicketTag);
}

Опять же: это не проверенное решение, просто несколько строк кода взломаны в этом редакторе. Он указывается как указатель, а не как готовый фрагмент кода.

1 голос
/ 01 июля 2011

Компоненты повторителя, такие как DataView и ListView, не имеют собственной разметки, но повторяют разметку с Item s. Вы можете проверить, является ли компонент instanceof RepeatingView.

Эта проблема легко показывается следующим неправильным примером:

ListView<Person> people = new ListView<Person>("people", list) {
    protected void onPopulateItem(ListItem<Person> item) {
        add(new Label("name", item.getModelObject().getName()));
    }
}

Здесь мы добавляем не метку к элементу списка, а список. И это не удается. Код должен был быть:

ListView<Person> people = new ListView<Person>("people", list) {
    protected void onPopulateItem(ListItem<Person> item) {
        item.add(new Label("name", item.getModelObject().getName()));
    }
}
...