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