将模型传递给子组件
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)
。
假设我有以下设置。
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)
。