这个问题是关于良好的Wicket设计。我们有几种方法可以实现它,但是想要获得一些如何更好地设计它的想法。我们只想构建一个简单的 TimerPanel ,带有标签和Timer(某种StopWatch)。
我们应该如何设计 Model 。我们确实需要IModel<LocalDateTime> timerUntil
。但是我们如何在 TimerPanel 中定义 Label 的文本?
TimerPanel 将用于 ParentPanel 。 ParentPanel有一个这样的模型:
public class ParentDto {
private LocalDateTime timerAValidUntil;
private LocalDateTime timerBValidUntil;
}
由于 ParentDto 没有关于TimerPanel标签的任何信息,以下
new PropertyModel(getDefaultModel(), "timerAValidUntil")
还不够。
这里的问题:我们应该定义一个固定的wicketId,让我们为timerLabel
中的标签说TimerPanel
,并且父面板必须在其中定义它Panel.properties.xml
?与(选项A)
timerPanelA:timerLabel
或者最好是创建一个新的ModelObject,比如(选项B)
public class TimerDto() {
String timerLabel;
IModel<LocalDateTime> timerValidUntil;
}
我们总是尝试连接我们的模型,因此如果我们在一个Panel中更改ModelObject,它也会在所有相关的Panel中更改。 请分享您的知识......谢谢。
答案 0 :(得分:1)
在ParentPanel(选项A)中使用资源键完全没问题,这甚至允许您使用标签。
如果您的计时器实体没有标签(例如,由用户编辑),我在添加标签时看不到任何收益。
Wicket几乎可以处理模型中的任何对象,因此无需构建DTO的中间层。通过将组件直接绑定到实际实体,您可以更快地进行开发。
我可能会弄错,但你的例子中的* Dto后缀给我的印象是,你正朝着相反的方向前进。
答案 1 :(得分:1)
选项A会更好,您可以使用StringResourceModel在一个控件中显示标签和时间。
PropertyModel timerModel = new PropertyModel(getDefaultModel(), "timerAValidUntil");
StringResourceModel labelModel = new StringResourceModel("timerLabel", this, timerModel));
Label timerLabel = new Label("timerLabel", labelModel);
如果你想让它有一个停止计时器&#39;动作,您可以在标签内添加链接。请参阅&#39;将wicket组件放入消息&#39;在Everything about Wicket internationalization