HY, 我想在某个条件下显示我的wicket模板的某个部分(例如div)(例如,只有当我有数据填充它时)。问题是:
如果我只是添加了面板(填充div),那么每次调用没有数据的页面时都会抛出异常(因为引用的wicket-id没有添加到组件树中)。
我想到的唯一解决方案是在没有数据的情况下添加一个空面板。这不是一个理想的解决方案,因为我在java代码中得到了一些不需要的代码,并且在我渲染的html中有很多空div。
那么,是否有更好的解决方案只在条件下包含wicket模板的几个部分?
答案 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的原因。在不了解您的代码的情况下,我只能说我认为您正在做的事情是我对AbstractRepeater和Fragment的某个孩子的组合所做的事情。如果你愿意多说一些你想做的事情,也许还会提供一些代码,我会很乐意尽我所能。
答案 4 :(得分:0)
你可以调用setVisible(false);在您要隐藏的组件上。