Wicket:模板中的条件显示

时间:2009-08-06 23:36:50

标签: java templates wicket

HY, 我想在某个条件下显示我的wicket模板的某个部分(例如div)(例如,只有当我有数据填充它时)。问题是:

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

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

那么,是否有更好的解决方案只在条件下包含wicket模板的几个部分?

5 个答案:

答案 0 :(得分:4)

虽然这是一个老问题,但这可能是另一个解决方案: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的封闭功能对我来说会更难看。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

是的,你想覆盖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(); } 
    };

答案 3 :(得分:1)

我想这就是EmptyPanel的原因。在不了解您的代码的情况下,我只能说我认为您正在做的事情是我对AbstractRepeaterFragment的某个孩子的组合所做的事情。如果你愿意多说一些你想做的事情,也许还会提供一些代码,我会很乐意尽我所能。

答案 4 :(得分:0)

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