这是一个普遍的问题:如何在wicket中构建我的网站及其所有页面和组件(此处为面板)。我想展示我的尝试,并希望有人可以给我建议,或者有一个好方法,或者有更好的方法。
我的结构就像:
Root:主页
Page1扩展主页
第2页扩展主页
第3页扩展主页
页面包装内容和自己的导航。他们在HomePage.html中使用wicket child获取init。
现在,当我为Page1定义一个新的Panel时,我也必须为它定义一个链接。对于链接onClick(),我将其引用的面板设置为可见,将所有其他面板设置为不可见。此外,我必须在Page1面板上定义,当我导航到Page1时会显示该面板。所有其他面板都是隐形的。
这是一次好尝试还是有更好的方法?现在我初始化任何面板,只是让它们看不见。
答案 0 :(得分:2)
回答你的问题......这假设你正在使用Wicket 1.4.x。
首先,您可以拥有多个级别的Page
类,通常模仿设计和功能的重叠。例如,假设您有一个人们“写”,“浏览”和“阅读”用户创建的书籍的应用程序。
RootPage - common headers/footers, javascript imports
AbstractWritePage extends RootPage - for anything regarding authoring
AbstractBrowsePage extends RootPage - browsing
AbstractReadPage extends ReadPage - reading
然后,我实现了类似的东西:
FullLibraryPage extends AbstractBrowsePage
FilterSearchPage extends AbstractBrowsePage
从长远来看,它变得复杂,但非常强大。
其次,您的Panel组件可见/不可见。如果您使用的是Wicket 1.4.x,则应该查看每个Panel的可覆盖方法onConfigure()
。在此面板中,您可以设置可见性,如:
@Override
protected void onConfigure() {
super.onConfigure();
setVisible(!navTriggered);
}
其中navTriggered
是驻留在包含页面中的布尔值。然后,你的链接可以做一个简单的事情:
@Override
protected void onClick(AjaxRequestTarget target) {
navTriggered = false;
target.addComponent(/* Appropriate panels; see below for multiples */);
}
这样做的好处是可以使用相同的布尔变量触发多个面板。在页面创建时创建所有面板没有任何问题,即使它们开始不可见。
最后,如果您有许多需要更改/触发/等的面板,请考虑将IVisitor
与标记界面配对。有点像...
public class Panel1 implements MyPanelGroup { ... }
public class Panel2 implements MyPanelGroup { ... }
然后,您可以使用IVisitor
访问页面中MyPanelGroup
的每个实例,并使用可见性执行操作(设置可见性,将其添加到AjaxRequestTarget
等)。
希望能回答一些问题:)