代码之家  ›  专栏  ›  技术社区  ›  theomega

Wicket:模板中的条件显示

  •  8
  • theomega  · 技术社区  · 16 年前

    Hy, 我希望仅在特定条件下(例如,仅当我有数据填充wicket模板时)显示wicket模板的特定部分(例如div)。问题是:

    如果我只在获得数据时添加面板(填充div),那么每次调用没有数据的页面时都会引发异常(因为引用的wicket id没有添加到组件树中)。

    我想到的唯一解决办法是在没有数据的情况下添加一个空面板。这不是一个理想的解决方案,因为我在java代码中得到了一些不需要的代码,在呈现的html中得到了许多空div。

    5 回复  |  直到 16 年前
        1
  •  5
  •   Karussell    15 年前

    虽然这是一个老问题,但这里可能还有一个解决方案: wicket:enclosure (及 this )

    使现代化 jetwick ).我正在使用WebMarkupContainer一个用于loggedIn状态,一个用于loggedOut状态,并设置正确的可见性:

    if (loggedIn()) {            
       WebMarkupContainer loggedInContainer = new WebMarkupContainer("loggedIn");
       //## do something with the user
       User user = getUserSomeWhere();
       loggedInContainer.add(new UserSearchLink("userSearchLink"));
       add(loggedInContainer);
       add(WebMarkupContainer("loggedOut").setVisible(false));
    } else {
       add(new WebMarkupContainer("loggedIn").setVisible(false));
       WebMarkupContainer loggedOutContainer = WebMarkupContainer("loggedOut");
       loggedOutContainer.add(new LoginLink() {...});
       add(loggedOutContainer);
    }
    

    对我来说,这样做的好处是防止在//###标记的行中出现NullpointerExc,我认为在这种情况下,wicket的封闭特性看起来更难看。

        2
  •  3
  •   tetsuo    16 年前

    就像@miaubiz所说的,您可以调用setVisible(false),或者您可以重写isVisible()方法,如果可见性是以其他状态为条件的(例如,字段已填充)。

        3
  •  3
  •   jgormley    16 年前

    是的,你想覆盖isVisible。这将使isVisible=false html标记甚至无法呈现到最终的html页面。此外,根据文件(在 EmptyPanel ),你可以使用 WebMarkupContainer 作为包装组件。

        this.add(new SimpleResourceModelLabel(NO_DATA_LABEL){
            private static final long serialVersionUID = 1L;
    
            @Override
            public boolean isVisible() { return myList.isEmpty(); } 
        });
    
        final WebMarkupContainer table = new WebMarkupContainer(MY_DATA_TABLE){
            private static final long serialVersionUID = 1L;
    
            @Override
            public boolean isVisible() { return !myList.isEmpty(); } 
        };
    
        4
  •  1
  •   Esko    16 年前

    我想这就是为什么会有 EmptyPanel . 在不了解你的代码的情况下,我只能说,我认为你所做的是我会结合一些 AbstractRepeater Fragment . 如果你愿意告诉更多关于你想做什么,也许还提供一些代码,我很乐意尽我所能提供帮助。

        5
  •  0
  •   miaubiz    16 年前

    您可以调用setVisible(false);在要隐藏的零部件上。