Как контролировать, где калитка добавляет элементы в заголовок?

StackOverflow https://stackoverflow.com/questions/4607591

Вопрос

Я знаю двумя способами добавить контент к <head> Раздел страницы в калитке. Вы можете использовать HeaderContributorS и вы можете использовать <wicket:head></wicket:head> В верхней части вашего HTML панели калитки.

Моя проблема в том, что это: мне нужно добавить определенные мета теги на особый страницы моего сайта для веб-аналитики, но мне нужно, чтобы они появились перед аналитическим сценарием, который я включаю в <head> раздел каждый страница. У меня есть базовая абстрактная страница, которая расширяется каждой другой страницей. Я хочу включить сценарий аналитика на базовой странице и добавить мета теги на панели, которые расположены на страницах, которые расширяют его. Однако по умолчанию Wicket добавляет контент, который вы помещаете в <wicket:head></wicket:head> из этих панелей после содержания, включенного в <head> Раздел базовой страницы.

Есть ли способ сказать калиту, чтобы предписать это <wicket:head></wicket:head> Содержание вместо того, чтобы добавить это?

Обновление: я использую веб -тра, а не Google Analytics, которая требует 2 скриптов: один в head раздел, а также один в нижней части страницы.

Это было полезно?

Решение

В калитке 1.5, они экспериментирование с разными IHeaderRenderStrategy Реализации, такие как ChildFirstheadeRenderStrategy (экспериментальный) или ParentfirstheadeLerenderStrategy (по умолчанию). Похоже, что повторный заусенцев вклады за заголовком был проблемой в 1.4, поэтому они надумывают его.

Однако для Wicket 1.4 есть какое-то решение. Идея состоит в том, чтобы изменить порядок в списке поведений (взносы заголовков - это просто еще один ibehavior). Каждый компонент имеет защищенный getBehaviors() Метод, который можно перезаписать. Хитрость заключается в том, чтобы найти поведение, которое соответствует вашему специальному файлу JS, которое должно быть включено в первую очередь. Я сделал это, создав свой собственный экземпляр объекта заголовками, поэтому я мог бы выполнить сравнение экземпляров, а затем использовать ArrayList для перемещения объекта заголовка от в середине списка поведения в верхнюю часть списка поведения:

public abstract class BasePage extends WebPage {

public BasePage() {
    add(HeaderContributor.forJavaScript("foo-base.js"));
}

}

Домашняя страница добавляет дополнительный скрипт, который должен быть представлен первым. Домашняя страница также перезаписывает метод Gebehaviors ():

public class HomePage extends BasePage {

private static final long serialVersionUID = 1L;

private final HeaderContributor contrib = new HeaderContributor(
        new IHeaderContributor() {
    public void renderHead(IHeaderResponse response) {
        response.renderJavascriptReference("foo-first.js");
    }
});

public HomePage(final PageParameters parameters) {
    add(new Label("message", "If you see this message ..."));
    add(contrib);
}

@Override
protected List getBehaviors(Class type) {
    List behaviors = super.getBehaviors(type);
    ArrayList sortedBehaviors = new ArrayList(behaviors);
    boolean moveToTop = true;
    if (moveToTop) {
        if (!sortedBehaviors.remove(contrib)) {
            throw new IllegalStateException();
        }
        sortedBehaviors.add(0, contrib);
    }
    return sortedBehaviors;
}
}

Теперь конечный результат будет то, что скрипт, добавленный на главную страницу, сначала визуализируется, и скрипт, добавленный BASPAGE, поступает впоследствии.

<html xmlns:wicket="http://wicket.apache.org/... >
<head>  
    <title>Wicket Quickstart Archetype Homepage</title>
<script type="text/javascript" src="foo-first.js"></script>
<script type="text/javascript" src="foo-base.js"></script>
</head>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top