Java Wicket可视性和类切换
我正在学习Wicket,现在我正在努力学习如何制作边栏菜单Java Wicket可视性和类切换,java,wicket,markup,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="li
<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>
- A
- B
- C
- D
- E
有些链接对某些用户不可见(根据用户的角色),当我在链接所在的页面上时,我希望
类处于活动状态(如示例中的linkB
)。Wicket是如何做到这一点的?要添加“class=”active“,只需将其添加到java代码中:
if(...condition...){
link.add(new AttributeAppender("class", "active");
}
要切换可见性,只需执行以下操作:
if(...condition...){
item.setVisible(false);
}
其中item是一个WebMarkupContainer,它通过wicket ID连接到一个html li标记(您也可以简单地调用link.setVisible(false),但列表项目符号仍将呈现出来)。wicket是面向组件的框架,因此“wicket方式”是通过覆盖组件方法实现的。在您的情况下,最简单的解决方案是将li
-s作为
导叶组件
// 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));
//用于加载用户的自定义方法
最终IModel用户=getUserModel();
最后一节私人课谢谢你的回答。有没有办法在标记中引用父节点,这样我就不必为所有指定wicket:id?请参阅我对下一个答案的评论谢谢你的回答。后续问题与Tom相同,是否有方法在标记中引用父节点,因此我不必将wicket:id分配给所有 s?据我所知(并遵循wicket准则),而不是。这个问题也与以下方面有关:。您可能正在使用引导,这将是常见情况,因此我绝对建议为链接实现自定义组件。通常,您不会手动创建列表,而是使用Wicket ListView来完成任务。使用ListView,您不必为每个项目提供Wicket id,因为ListView会处理它。这不太正确:您仍然需要将Wicket:id放在ListView的li元素上,然后在populateItem(…)中添加链接。@Tom感谢您指出ListView。代码现在看起来好多了。