Вопрос о наследовании калитки - PullRequest
1 голос
/ 03 ноября 2011

Я разрабатываю приложение Wicket для колледжа и столкнулся с (несколько хитрой) проблемой.

Для контекста: я делаю приложение, использующее проигрыватель HTML5, и я решил дать конструктору страницы, содержащему проигрыватель, PageParamameters, чтобы сделать запрос и получить источники для СМИ.

Теперь моя проблема в том, что я использую шаблон, поэтому я создал страницу, которая автоматически помещает верхний и нижний колонтитулы, но мой проигрыватель нуждается в PageParameters, и я пытаюсь сделать так, чтобы он мог простирается от BasePage, но конструктор с базовой страницы также имеет некоторые параметры, поэтому он может динамически изменять текст заголовка на основе страницы, на которой он находится в данный момент. Это делает сложным метод super():

protected BasePage(String tabHeader, String header) {
    add(new Label("tab_title", tabHeader));
    add(new Header("header", header));
    add(new UserPanel("user_panel"));
    add(new Footer("footer"));
}

И моя страница игрока:

public PlayerPage(PageParameters params) {
    String name = params.get("name").toString();
    MediaItem item = getItem(name.trim());

    add(new Label("tab_title", "MaeGûl - " + name)); //trying to get rid of this
    add(new Header("header", item.getName())); //and this
    add(new UserPanel("user_panel")); //and this

    if (item.getType().equals(ItemTypes.MUSIC)) {
        add(new AudioPlayer("player", item.getMediaSources()));
    } else if (item.getType().equals(ItemTypes.SERIES)
            || item.getType().equals(ItemTypes.MOVIES))
        add(new VideoPlayer("player", item.getMediaSources()));

    add(new Footer("footer")); //and this
}

Как вы можете видеть, если я добавлю super(tabHeader, header) в свой конструктор PlayerPage, ему понадобится параметр "name" для обновления заголовка и tabHeader BasePage, так что я ошеломлен ...

Какие-нибудь решения для этого?

Ответы [ 2 ]

2 голосов
/ 03 ноября 2011

Вы можете изменить BasePage для принятия моделей вместо строк:

protected BasePage(IModel<String> tabHeader, IModel<String> header)

и делегировать извлечение значений выделенным моделям, например, получено из AbstractReadOnlyModel:

public PlayerPage(PageParameters params) {
    super(new TabHeaderModel(params), new HeaderModel(params));
    ...
}
0 голосов
/ 03 ноября 2011

Конечно, существует метод, который может использоваться любым компонентом для получения PageParameters. Это ..

getPage().getPageParameters();

Чтобы getPageParameters() возвратил ненулевое значение, вы должны вызвать конструктор Wicket Page с super(params), поэтому настаивая на том, что ваш BasePage имеет конструктор BasePage(PageParameters params).

На самом деле, если вы поэкспериментируете с этим некоторое время, если вы используете BookmarkablePageLink и PageParameters для большинства своих страниц, то все, что расширяет Page, должно реализовывать только конструктор Page(PageParameters params). Это не применяется, если вы используете относительные страницы сеанса и много кода типа new PlayerPage().

...