Wicket-添加body标记属性

Wicket-添加body标记属性,wicket,Wicket,我卡住了- 我需要有一个Wicket面板,以便能够将class属性添加到它所在页面的标记中。 用法示例: 爪哇: 生成的HTML: <body class="sidebar"> ... <div id="sidebar">My Wicket Panel</div> ... </body> 模板: <html> <body> <div wicket:id="sidebar">Sideba

我卡住了-

我需要有一个Wicket面板,以便能够将class属性添加到它所在页面的标记中。 用法示例:

爪哇:

生成的HTML:

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

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

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

很让人困惑的名字是IMHO。这并不能解决问题,但至少更有意义。

如果你真的不能给标签一个wicket:id,我会假设你没有一个每个或几乎每个其他页面都扩展的基页来抽象它,那么在页面呈现时就不可能知道该标签呈现时要附加到哪个类,它将按原样从HTML复制到输出

但是,您可以通过javascript实现同样的功能。使您的面板实现IHeaderContributor并使用


如果您真的不能给标记一个wicket:id,我将假设您没有一个每个或几乎每个其他页面都在其中扩展的基页来抽象它,那么在页面呈现时就不可能知道该标记呈现时要附加到哪个类,它将按原样从HTML复制到输出

但是,您可以通过javascript实现同样的功能。使您的面板实现IHeaderContributor并使用


我认为您使用BodyTagAttributeModifier是正确的,至少根据JavaDoc。链接文章中的编译问题源于使用不存在的构造函数

在SpecialSidebarComponent中,您应该能够做到这一点:

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

现在无法尝试此操作,因为我不在开发计算机上…

至少根据JavaDoc,我认为您使用BodyTagAttributeModifier的方法是正确的。链接文章中的编译问题源于使用不存在的构造函数

在SpecialSidebarComponent中,您应该能够做到这一点:

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

现在无法尝试此操作,因为我不在开发计算机上…

我个人认为Javascript选项在这种特定情况下是最干净的。但是,您对addComponent的评论。。。作为最终用户,我相信您可能对setTransparentResolvertrue方法感兴趣。下面是它的工作原理

BasePage.html

<body wicket:id="body">
    <div wicket:id="panel" />
</body>
即使您没有将侧边栏面板直接添加到BasePage中的bodyContainer中,但由于setTransparentResolvertrue,它仍然可以工作


对于您的简单情况,请使用Javascript。对于感觉受子类约束而无法装入容器的一般问题,请注意透明解析。

我个人认为Javascript选项对于这种特定情况是最干净的。但是,您对addComponent的评论。。。作为最终用户,我相信您可能对setTransparentResolvertrue方法感兴趣。下面是它的工作原理

BasePage.html

<body wicket:id="body">
    <div wicket:id="panel" />
</body>
即使您没有将侧边栏面板直接添加到BasePage中的bodyContainer中,但由于setTransparentResolvertrue,它仍然可以工作


对于您的简单情况,请使用Javascript。对于感觉受子类约束而无法装入容器的一般问题,请注意透明解析。

感谢mate-添加了有关该类实际功能的信息,仅适用于面板的父标记,而不适用于页面BodyThank mate-添加了有关该类实际功能的信息,仅适用于面板的父标记,不是页面主体谢谢你的想法,没有考虑Javascript方法-看起来很有趣。在另一点上-我确实有一个基类,但是使用addComponent。。。最后,从子类中添加组件是一件痛苦的事情,除非我创建自定义的新方法,如addComponent…,等等。如果你有一个BasePage,为什么不使用wicket:id作为标记,并通过getPage获得它。例如,在面板的onBeforeRender中查找,并为其添加一个AttributeModifier?谢谢你的想法,没有考虑Javascript方法-看起来很有趣。在另一点上-我确实有一个基类,但是使用addComponent。。。最后,除非我创建自定义的新方法(如addComponent…)等,否则从子类中添加组件是一件痛苦的事情。如果你有一个BasePage,为什么不使用wicket:id作为标记,并通过getPage获取它。例如,在面板的onBeforeRender中查找并向其添加AttributeModifier?很好的例子,但我认为OP讨论的是从添加的面板而不是页面子类修改页面。假设每个页面都扩展了BasePage,您可以执行BasePage getPage.bodyClass=。。。。当然,我已经在基本页面上用自定义方法做了很多。好吧,事实上,正如我在评论中指出的那样,这是一条路要走。不过,我仍然看不出在这个例子中transparentResolver和子类化有什么作用。海报指出,主体容器使向页面添加组件变得很困难-可能是因为您必须在主体容器前面加前缀。添加。。。对一切。使用透明解算器,您不需要这样做。海报也在
表明他使用的是BasePage类型的场景。我已经用一个对话框类型的组件做了很多,它有一个包装容器作为边框,但我不想在父类的容器中添加组件。哦,太好了,现在我看到了,谢谢你的评论:+1,一个透明的解析器是一个很好的选择。虽然在本例中,我将创建一个仅包含标记和的BasePage超类。这是一个很好的示例,但我认为OP讨论的是从添加在其中的面板修改页面,而不是从页面子类修改页面。假设每个页面都扩展BasePage,您可以执行BasePage getPage.bodyClass=。。。。当然,我已经在基本页面上用自定义方法做了很多。好吧,事实上,正如我在评论中指出的那样,这是一条路要走。不过,我仍然看不出在这个例子中transparentResolver和子类化有什么作用。海报指出,主体容器使向页面添加组件变得很困难-可能是因为您必须在主体容器前面加前缀。添加。。。对一切。使用透明解算器,您不需要这样做。海报还指出,他正在使用一个基本页面类型的场景。我已经用一个对话框类型的组件做了很多,它有一个包装容器作为边框,但我不想在父类的容器中添加组件。哦,太好了,现在我看到了,谢谢你的评论:+1,一个透明的解析器是一个很好的选择。虽然在本例中,我将创建一个只包含标记和的BasePage超类。
<body wicket:id="body">
    <div wicket:id="panel" />
</body>
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")));
    }
}
public class MyPage extends BasePage {

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