Компонент декоратора в калитке - PullRequest
0 голосов
/ 31 мая 2010

Возможно ли реализовать какой-то компонент декоратора в калитке? Специально при чтении идентификатора украшенного компонента?

В настоящее время я пытаюсь решить эту проблему с помощью компонента Border, выполняющего функции декоратора:

Дано:

public XXXPage()
{
   MyBorder border = new MyBorder("xxx");
   border.add( new Label("xxx", "Foo") ); // label just as simplification. Its really a Component that we want to surround the anchor (linkify) around.
   add(border);
} 

XXXPage.html

<body>
<span wicket:id="xxx"/>
</body>

MyBorder.html

<wicket:border>
<a wicket:id="link"><wicket:body/></a>
</wicket:border>

MyBorder.java

public MyBorder(String id)
{
    super(id);
    AjaxLink link = new AjaxLink("link")
    {
       @Override public void onClick(AjaxRequestTarget arg0)
      {
      }
    };
add(link);
link.add(getBodyContainer()); // from javadoc of Wicket's Border
}

Дает:

org.apache.wicket.WicketRuntimeException: The component(s) below failed to render. A     common problem is that you have added a component in code but forgot to reference it in the markup (thus the component will never be rendered).

1. [Component id = xxx]
at org.apache.wicket.Page.checkRendering(Page.java:1182)

Таким образом, по сути, компонент xxx должен быть прозрачным образом обернут компонентом link. Этот ххх вышел из-под контроля.

В реализации «Банановая калитка» это может быть псевдокод:

Component wrapWithAction(Component a) {
// now wrap
    Link b = new Link() {
     // handle link onClick and all that
    }
    b.wrap(a);
    return b;
}
// 

Ответы [ 3 ]

2 голосов
/ 24 октября 2010

Зависит от того, какие вещи хочет сделать ваш декоратор. Обычный смысл декорирования состоит в том, чтобы объект B взял на себя роль объекта A, предоставляя точно такой же контракт, используя A для реализации этого контракта, но делая что-то дополнительно к этому. Я думаю, что это не очень распространенный случай с виджетами. Скорее, вы хотите повторно использовать какую-то часть (пользовательский интерфейс и состояние, возможно, поведение). В целом, на мой взгляд, это лучше всего работает с использованием панелей и наследования разметки.

Технически, границы - это готовое многократно используемое решение для декорирования, но на практике с ними немного сложновато работать. Относительно простой способ выполнения простых декораций см. В моем ответе Создание закомментированного контента с помощью Wicket (который использует несколько недокументированный способ работы конвейера рендеринга Wicket). Также показывает, что поведение Wicket является очень гибким способом изменения поведения существующих компонентов без необходимости изменения самих этих компонентов. Кроме этого, я бы просто разработал для повторного использования явно.

1 голос
/ 31 мая 2010

Я думаю, вам будет лучше, если вы добавите либо WebMarkupContainer, либо Fragment в свой ListView, чем что-либо еще. Эти два могут содержать другие компоненты, такие как ссылки, метки и т. Д.

Дайте мне знать, если вам нужна дополнительная помощь ..

0 голосов
/ 31 мая 2010

Добавьте AjaxEventBehavior для "onclick" к Компоненту. Пример в Javadoc, который я привел, делает то, что вы хотите.

Вы можете добавлять Поведения практически ко всему в Wicket, это одна из его самых мощных функций.

...