Передача модели дочернему компоненту

#java #wicket

#java #калитка

Вопрос:

Допустим, у меня есть следующая настройка.

 public class TextPanel extends Panel {

    public TextPanel(String id) {
        this(id, null);
    }

    public TextPanel(String id, IModel<?> model) {
        super(id, model);
        add(new Label("text", model));
    }
}
 

Каков наилучший способ поддерживать модель метки в актуальном состоянии. Я могу придумать два способа, но я не уверен, есть ли какие-либо недостатки или лучшие способы.

Переопределение onModelChanged и вызов get("text").setDefaultModel(getDefaultModel()) или реализация (новой?) модели.

 public class DefaultComponentModel implements IModel<Object> {

    private final Component component;

    public DefaultComponentModel(Component component) {
        this.component = component;
    }

    @Override
    public Object getObject() {
        return component.getDefaultModelObject();
    }

    public void setObject(Object object) {
        component.setDefaultModelObject(object);
    }
}
 

И использовать его для метки. ( new Label("text", new DefaultComponentModel(this)) )

Важно то, что решение должно работать при изменении defaultModel компонента или использовании CompoundPropertyModel.

Ответ №1:

Я бы заменил this(id, null); на this(id, Model.of("")); . Таким образом, вы можете обновить объект модели TextPanel (например textPanel.setModelObject("new text") ), и это автоматически обновит метку.

Если вы установите новую модель (т. Е. textPanel.setModel(newModel) Тогда вам придется переопределить метод TextPanel#setModel() и вызвать get("text").setModel(newModel) тоже.

Комментарии:

1. Почему-то я всегда думал, что setDefaultModel(model) это окончательно. Но теперь, когда я знаю, что это не окончательное, просто переопределение кажется лучшим подходом. Единственным недостатком является то, что CompoundPropertyModel не работает.