0

我正在学习 Wicket,现在我正在为如何制作侧边栏菜单而苦苦挣扎。

<ul class="nav nav-tabs nav-stacked">
    <li><a wicket:id="linkA">A</a></li>
    <li class="active"><a wicket:id="linkB">B</a></li>
    <li><a wicket:id="linkC">C</a></li>
    <li><a wicket:id="linkD">D</a></li>
    <li><a wicket:id="linkE">E</a></li>
</ul>

有些链接对某些用户不可见(根据用户的角色),当我在链接所在的页面上时,我想要<li>上课active(就像linkB示例中的那样)。这样做的 Wicket 方式是什么?

4

2 回答 2

6

To add 'class="active"' you can simply add this to your java code:

if(...condition...){
  link.add(new AttributeAppender("class", "active");
}

To toggle visibility you can simply do this:

if(...condition...){
  item.setVisible(false);
}

where item is a WebMarkupContainer that is connected to one of the html li-tags via a wicket ID (you can also simply call link.setVisible(false), but the list bullet point would still be rendered then).

于 2013-05-26T10:26:05.483 回答
2

Wicket 是面向组件的框架,因此“Wicket 方式”是通过覆盖组件方法。在您的情况下,最简单的解决方案是将li-s 作为 Wicket 组件。



    // your custom method to load the user
    final IModel<User> user = getUserModel();
    final private Class<? extends WebPage> pageLinkA;

    WebMarkupContainer li = new WebMarkupContainer("linkContainerA") {

        @Override
        protected void onConfigure() {
            super.onConfigure();
            boolean visible = user.getObject().hasRoleXY();
            setVisible(visible);
        }

        @Override
        protected void onComponentTag(ComponentTag t) {
            super.onComponentTag(t);
            if(getPage().getClass() == pageLinkA) {
               t.put("class", "active");
            }

        }
    }

   li.add(new BookmarkablePageLink("linkA", pageLinkA));

 

为了避免代码重复,最合适的方法是创建自定义组件(扩展 Panel 或 GenericPanel)或至少扩展 WebMarkupContainer。

编辑:正如汤姆指出的那样,您也可以使用 AttributeAppender 并将其直接添加到onConfigure()(基于 getPage().getClass() == pageLinkA )。这样onComponentTag就不需要覆盖了。

于 2013-05-26T10:42:20.283 回答