Wicket - добавить атрибут тега body - PullRequest
1 голос
/ 28 октября 2011

Я застрял -

Мне нужно, чтобы панель калитки могла добавить атрибут класса к тегу любой страницы, на которой он находится.Пример использования:

Java:

add(new SpecialSidebarComponent("sidebar"));

Сгенерированный HTML:

<body class="sidebar">
   ...
   <div id="sidebar">My Wicket Panel</div>
   ...
</body>

Я не могу добавить wicket: id и сделать тело компонентом Wicket, потому что это делаеточень сложно добавить компоненты на страницу в большой иерархии страниц, которая у меня есть, и все равно также трудно позволить Panel изменять атрибут body.

Я думал, что BodyTagAttributeModifier может быть для этого, нопо-видимому, это для чего-то другого и не может заставить его работать ( Wicket: как использовать класс BodyTagAttributeModifier? )

Любые полезные идеи?

Обновление:

Если посмотреть на него, кажется, что класс BodyTagAttributeModifier * для родительского тега Panel, а не тег страницы:

Пример (синтаксис Scala):

class Home extends WebPage {
  add(new Sidebar("sidebar"))
}
class Sidebar(id: String) extends Panel(id) {
  add(new BodyTagAttributeModifier("class", true, new Model("layout-class"), getParent))
}

Шаблон:

<html>
<body>
    <div wicket:id="sidebar">Sidebar</div>
</body>
</html>

Оказано:

<html>
<body>
    <div class="layout-class">
        <h1>Hello World!</h1>
    </div>
</body>
</html>

Очень запутанное имя ИМХО.Не решает проблему, но, по крайней мере, имеет больше смысла.

Ответы [ 3 ]

3 голосов
/ 29 октября 2011

Лично я считаю, что опция Javascript является самой чистой для этого конкретного случая.Однако ваш комментарий о том, что add(Component...) является окончательным, заставляет меня поверить, что вас может заинтересовать метод setTransparentResolver(true).Вот как это работает ...

BasePage.html

<body wicket:id="body">
    <div wicket:id="panel" />
</body>

BasePage.java

public class BasePage extends Page {

    public String bodyClass = "";

    public BasePage() {
       super();
       WebMarkupContainer bodyContainer = new WebMarkupContainer("body");
       bodyContainer.setTransparentResolver(true);
       bodyContainer.add(new SimpleAttributeModifier("class", new PropertyModel<String>(this, "bodyClass")));
    }
}

MyPage.java (расширяет BasePage)

public class MyPage extends BasePage {

    public MyPage() {
        super();
        add(new SidebarPanel("panel"));
        super.bodyClass = "sidebar";
    }
}

Даже если вы не добавляете SidebarPanel непосредственно к bodyContainer в BasePage, он все равно сработает из-за setTransparentResolver(true).

Для вашего простого случая используйте Javascript.Для общей проблемы ощущения, что подклассы не могут поместиться внутри контейнеров, помните о прозрачном разрешении.

2 голосов
/ 28 октября 2011

Если вы действительно не можете присвоить тегу <body> идентификатор wicket: id (я предполагаю, что у вас нет BasePage, на который расширяется каждая или почти каждая другая страница, чтобы абстрагировать это), это 'Во время рендеринга страницы (когда рендеринг этого тега <body>) будет невозможно узнать, какой класс добавить к нему, он будет просто скопирован из вашего HTML-кода в выходной файл.

Вы можете добиться того же с помощью JavaScript, однако.Сделайте ваш Panel агрегат IHeaderContributor и используйте IHeaderResponse.renderOnDomReadyJavscript().

public abstract class SpecialSidebarComponent(String id) extends Panel 
                 implements IHeaderContributor {
    .....
    public void renderHead(IHeaderResponse response){
        String javascript = "document.body.setAttribute('class', 'sidebar');";
        response.renderOnDomReadyJavascript(javascript);
    }
    ....
}
0 голосов
/ 28 октября 2011

Я думаю, что вы были на правильном пути с BodyTagAttributeModifier, по крайней мере, в соответствии с JavaDoc.Проблемы компиляции в связанной статье проистекают из использования несуществующего Конструктора ...

в SpecialSidebarComponent, вы должны быть в состоянии сделать это:

add(new BodyTagAttributeModifier("class", Model.of("sidebar"), this));

Не можете попробовать этопрямо сейчас, потому что я не на своем компьютере для разработки ...

...