Калитка: где добавить компоненты? Конструктор? Или на BeforeRender? - PullRequest
5 голосов
/ 06 февраля 2011

Я новичок в калитке.Это может быть просто мое незнание жизненного цикла калитки, поэтому, пожалуйста, просветите меня!Насколько я понимаю, объекты 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()?

Ответы [ 3 ]

10 голосов
/ 10 февраля 2011

Для компонентов, которые не являются 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();
}

Использование PropertyModel для извлечения содержимого метки намного лучше, чем вставка значения в метку.

5 голосов
/ 06 февраля 2011

Вы должны добавить компоненты в конструктор, как правило, из которых очень мало исключений. Грубо говоря, есть фаза для настройки иерархии (построения) и отдельная фаза для ее рендеринга. Не рекомендуется (и часто запрещено) смешивать их.

0 голосов
/ 26 октября 2011

Метод onBeforeRender полезен для обработки видимой опции компонента или управления моделью.

...