将模型传递给子组件

Pass model to child component

假设我有以下设置。

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 时,该解决方案应该有效。

我会将 this(id, null); 替换为 this(id, Model.of(""));。这样您就可以更新 TextPanel 的模型对象(例如 textPanel.setModelObject("new text")),这将自动更新标签。

如果您设置了一个新模型(即 textPanel.setModel(newModel) 那么您将不得不重写 TextPanel#setModel() 方法并调用 get("text").setModel(newModel)