Wicket可见性和类切换

时间:2013-05-26 10:04:19

标签: java wicket markup

我正在学习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这样做的方式?

2 个答案:

答案 0 :(得分:6)

要添加'class =“active”',您只需将其添加到您的java代码中:

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

要切换可见性,您只需执行此操作:

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

其中item是一个WebMarkupContainer,它通过一个wicket ID连接到其中一个html li-tags(你也可以简单地调用link.setVisible(false),但是列表项目符号点仍会被渲染)。

答案 1 :(得分:2)

Wicket是面向组件的框架,因此“Wicket-way”是通过覆盖组件方法。在您的情况下,最简单的解决方案是将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。

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