Wicket:在哪里添加组件?构造函数?还是onBeforeRender?

gma*_*ett 5 java wicket

我是一个Wicket newb.这可能只是我对Wicket生命周期的无知所以请赐教!我的理解是Wicket WebPage对象被实例化一次然后被序列化.这给我带来了一些困惑,见下文.

目前我有一个模板类,我打算将其子类化.我按照Wicket文档中的示例演示了如何在子类中覆盖模板的行为:

protected void onBeforeRender() {
        add(new Label("title", getTitle()));

        super.onBeforeRender();
}

protected String getTitle() {
        return "template";
}
Run Code Online (Sandbox Code Playgroud)

子类:

protected String getTitle() {
        return "Home";
}
Run Code Online (Sandbox Code Playgroud)

这非常有效.我不清楚的是"最佳实践".似乎onBeforeRender()每次请求页面都会调用,不是吗?如果一切都在,这似乎会在页面上完成更多的处理onBeforeRender().我可以轻松地遵循其他Wicket示例的示例,并在构造函数中添加一些我不想覆盖的组件,但后来我将组件逻辑划分为两个位置,这是我犹豫不决的事情.

如果我添加一个我打算在所有子类中的组件,我应该将它添加到构造函数中onBeforeRender()吗?

Mar*_*rst 10

对于非a的组件Page,您可以覆盖新的onInitialize回调以添加组件,这些组件仅在构建后调用一次,此时组件已添加到页面中(因此component.getPage()不会返回null).

另一个选择是使用addOrReplace()而不是add.

至于在构造函数中调用重写方法,尝试在一个Model或一些其他延迟回调中执行此操作.在您的示例中,解决方案更简单:

public abstract class BasePage extends WebPage {
    public BasePage() {
        add(new Label("title", new PropertyModel<String>(this, "title")));
    }
    public abstract String getTitle();
}
Run Code Online (Sandbox Code Playgroud)

使用a PropertyModel检索标签的内容比将值推入标签要好得多.


Eel*_*lco 5

您应该在构造函数中添加组件作为规则,几乎没有例外.粗略地说,有一个阶段用于设置层次结构(构造),以及一个用于渲染它的单独阶段.不建议(并且经常禁止)将两者混合使用.