Как контролировать, где калитка добавляет элементы в заголовок?
Вопрос
Я знаю двумя способами добавить контент к <head>
Раздел страницы в калитке. Вы можете использовать HeaderContributor
S и вы можете использовать <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>