Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Wicket可视性和类切换_Java_Wicket_Markup - Fatal编程技术网

Java 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

我正在学习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>
  • 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。代码现在看起来好多了。