Wicket:在哪里添加组件? 构造函数? 还是onBeforeRender?
我是Wicket newb。 这可能只是我对Wicket生命周期的无知所以请赐教! 我的理解是Wicket WebPage
对象被实例化一次然后被序列化。 这让我感到困惑,见下文。
目前我有一个模板类,我打算子类。 我按照Wicket文档中的示例演示了如何在子类中覆盖模板的行为:
protected void onBeforeRender() { add(new Label("title", getTitle())); super.onBeforeRender(); } protected String getTitle() { return "template"; }
子类:
protected String getTitle() { return "Home"; }
这非常有效。 我不清楚的是这方面的“最佳实践”。 似乎onBeforeRender()
在页面的每个请求上都被调用,不是吗? 如果一切都在onBeforeRender()
这似乎会在页面上完成更多的处理。 我可以轻松地遵循其他Wicket示例的示例,并在构造函数中添加一些我不想覆盖的组件,但后来我将组件逻辑划分为两个位置,这是我犹豫不决的事情。
如果我添加一个我打算在所有子类中的组件,我应该将它添加到构造函数或onBeforeRender()
吗?
对于不是Page
组件,您可以覆盖新的onInitialize
回调以添加组件,这些组件仅在构造之后调用一次,此时组件已添加到页面中(因此component.getPage()
不返回null
) 。
另一种选择是使用addOrReplace()
而不是add
。
至于在构造函数中调用重写方法,请尝试在Model
或其他延迟回调中执行此操作。 在您的示例中,解决方案更简单:
public abstract class BasePage extends WebPage { public BasePage() { add(new Label("title", new PropertyModel(this, "title"))); } public abstract String getTitle(); }
使用PropertyModel
检索标签的内容比将值推入标签要好得多。
您应该在构造函数中添加组件作为规则,几乎没有例外。 粗略地说,有一个阶段用于设置层次结构(构造),以及一个用于渲染它的单独阶段。 不建议(并且经常禁止)将两者混合使用。
onBeforeRender方法可用于处理组件的可见选项或模型的管理。