8

嗨,我只想在特定条件下(例如,只有当我有数据来填充它时)才显示我的检票模板的某个部分(例如 div)。问题是:

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

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

那么是否有更好的解决方案仅在某种条件下包含检票模板的几个部分?

4

5 回答 5

5

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

更新:现在我自己需要这个功能(对于jetwick)。我正在使用 WebMarkupContainer 一个用于已登录状态,一个用于已登录状态并设置正确的可见性:

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 的封闭功能对我来说看起来更难看。

于 2010-08-01T17:03:24.523 回答
3

就像@miaubiz 说的那样,你可以调用 setVisible(false),或者你可以覆盖 isVisible() 方法,如果可见性取决于其他状态(例如,字段填充)。

于 2009-09-22T02:13:14.050 回答
3

是的,你想覆盖 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(); } 
    };
于 2010-05-04T16:42:26.260 回答
1

我想这就是为什么会有EmptyPanel。在不了解您的代码的情况下,我只能说我认为您正在做的事情是我会结合AbstractRepeaterFragment的一些孩子来做的事情。如果您愿意更多地了解您想要做什么,并且可能还提供一些代码,我将很乐意尽我所能提供帮助。

于 2009-08-08T08:56:58.260 回答
0

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

于 2009-09-09T08:22:12.520 回答