Калитка: изменить тело компонента из IBehavior :: onComponentTag - PullRequest
0 голосов
/ 19 октября 2010

Я реализую интерфейс Wicket IBehavior и хочу, чтобы мое поведение изменяло тело компонента (или каким-либо образом обновляло модель) с помощью метода onComponentTag. Есть ли способ сделать это?

@Override
public void onComponentTag(final Component component, final ComponentTag tag)
{
    String myValue = tag.getAttribute("myAttribute");

    // TODO: Based on the value of this attribute, update the body/model of the component


    super.onComponentTag(component, tag);
}

Редактировать : Я хотел бы получить атрибут из html, который определяет максимальное количество разрешенных символов для элемента, а затем программно обрезать тело элемента, если это необходимо.

Пример:

<span wicket:id="myLabel" maxChars="10">The body of my tag</span>

будет заменено на:

<span wicket:id="myLabel" maxChars="10">The bod...</span>

Ответы [ 2 ]

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

Получено из Quickstart http://wicket.apache.org/start/quickstart.html мое предложение будет выглядеть так:

    add(new Label("message", "If you see this message wicket is properly configured and running") {

        @Override
        protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
            String myAttrib = openTag.getAttribute("myAttrib");
            replaceComponentTagBody(markupStream, openTag, getDefaultModelObjectAsString().substring(0, Integer.valueOf(myAttrib)));
        }

    });

Не забывайте следить за исключениями NumberFormat.

Также предложения Донроби действительно применимы. Не связывайтесь с моделью, если она не нужна.

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

Вы можете сделать это, получая модель из компонента, получая объект из модели и внося любые необходимые изменения в объект, но onComponentTag не лучшее место для работы, которая меняет модель.

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

Если вы пытаетесь изменить визуализированное тело, это другая история, и совершенно разумная работа для этого метода. Обычно это вызывает вызов методов для параметра ComponentTag tag.

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

РЕДАКТИРОВАТЬ:

В конкретном случае обрезки дисплея на этикетке вам, вероятно, лучше обслужить, просто подклассифицируя компонент Label примерно следующим образом:

public class TrimmedLabel extends Label {
    private int size;

    public TrimmedLabel(String id, int size) {
        super(id);
        this.size = size;
    }

    public TrimmedLabel(String id, String label, int size) {
        super(id, label);
        this.size = size;
    }

    public TrimmedLabel(String id, IModel model, int size) {
        super(id, model);
        this.size = size;
    }

    @Override
    protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
        String value = getModelObjectAsString();
        if (value.length() > size) {
            value = value.substring(0, size);
        }
        replaceComponentTagBody(markupStream, openTag, value);
    }
}
...