我在检票口的本地化方面遇到了一些问题。
这是代码:
private String displayString;
private TextField<String> myTextField;
public myPage(DomainObject domainObject){
if(domainObject != null)
displayString = domainObject.getDisplayString();
myTextField = new TextField<String>("myTextField", new PropertyModel<String>(this, "displayString"));
if(Strings.isEmpty(displayString))
displayString = getString("mandatory"); //<- error message here
}
问题是在构造函数中调用getString会导致错误消息(“...这有时会导致无效或没有返回本地化资源......”)。 我想为TextField使用PropertyModel,因为我不想翻译我从domainObject.getDisplayString()获得的字符串。我不希望TextField中的更改直接影响domainObject中的值。 可以通过执行此操作而不是getString来删除错误消息:
if(Strings.isEmpty(displayString))
displayString = new ResourceModel("mandatory").getObject(); //<- no error message
据我所知,这与调用getString是一样的(你只需要删除警告,但问题仍然存在)。 我想到的解决方案就是:
@Override
protected void onAfterRender() {
super.onAfterRender();
if(Strings.isEmpty(displayString))
displayString = getString("mandatory"); //<- no error message
}
是否有人发现此解决方案存在问题?也许我不是在想“摇摇晃晃”?
答案 0 :(得分:6)
调用getString()要求组件位于组件层次结构中,在组件层次结构中,组件可以访问它的父级,以便有机会回退到那里定义的属性或树中的更多属性。这在组件的构造函数中是不可能的(因为稍后将它添加到它的父级)。 Wicket 1.5为这些操作引入了onInitialize函数。在此之前使用Wicket版本,有一种简单的方法可以模拟这种行为:
在基本组件和页面中将非最终的空方法定义为
protected void onInitialize() {}
并将其添加到onBeforeRender方法:
protected void onBeforeRender() {
...
if (!hasBeenRendered()) {
onInitialize();
}
...
}
然后,您可以在任何组件中使用重写的onInitialize()方法来处理必须等到组件层次结构建立的内容。
答案 1 :(得分:2)
可重用行为怎么样:
public class MandatoryBehavior extends AbstractBehavior {
public void onComponentTag(Component component, ComponentTag tag) {
if (((AbstractTextComponent)component).isRequired() && Strings.isEmpty(tag.get("value"))) {
tag.put("value", component.getString("mandatory"));
}
}
}
您必须在验证器中检查提交的值。
HTML5占位符更加出色。