我在表单中有一个Select Enum组件,用于在更改时更新区域。这很好用:
<t:select t:id="anEnum" validate="required" zone="${getZone()}" />
public String getZone() {
if (anEnum== AnEnum.TYPE1) {
return "zone1";
} else if (anEnum== AnEnum.TYPE2) {
return "zone2";
} else {
return "zone3";
}
}
@OnEvent(value = EventConstants.VALUE_CHANGED, component = "anEnum")
public Object updateDisplay(AnEnum anEnumIn) {
anEnum= anEnumIn;
if (anEnum== AnEnum.TYPE1) {
return zone1.getBody();
} else if (anEnum== AnEnum.TYPE2) {
return zone2.getBody();
} else {
return zone3.getBody();
}
}
我遇到的问题是,当我提交表单并且在onValidate方法的java类中处理验证时,页面会显示错误的区域 - 通常是区域3(这可能是有意义的,因为它的'else'返回上面的方法)。我如何获得正确的区域再次渲染 - 我在anEnum上尝试了@persist而没有运气,而且以下也没有工作
@SetupRender
void setupRender() {
updateDisplay(anEnum);
}
任何帮助表示赞赏!
答案 0 :(得分:1)
您正在检查anTypeEnum
中的getZone()
实例变量,您要在anEnum
中设置updateDisplay()
实例变量。如果这不是你问题中的拼写错误,那就是你的问题。
如果这是拼写错误,anTypeEnum
由于某种原因将为空。但是如果没有完整的代码,我无法评论这是怎么回事。如果您没有@Persist
,则会在表单提交和页面呈现之间清除它,或使用onPassivate()
和onActivate()
在请求之间保留值。它应该与@Persist
一起使用,因此您必须将其设置为以某种方式为空。请分享您的完整组件/页面代码。
PS:取代zone="${getZone()}"
使用zone="zone"
答案 1 :(得分:0)
我找到了问题的答案 - 如果我之前发布了更全面的代码,可能是社区成员找到的(已吸取经验教训!)。
按照一个例子我已经看到(道歉我已失去链接)使用Select我已经将我的两个区域之一设置为visible =“false”更新区域。
<t:zone t:id="zone1" id="Zone1" visible="false">
这意味着即使在验证后重新呈现页面,visible = false也是先例。我已经更新了代码来调用java中的方法来检查区域是否可见。
TML
<t:zone t:id="zone1" id="Zone1" visible="${isZoneVisible()}">
的java
public boolean isZoneVisible() {
if (anEnum== AnEnum.TYPE1) {
return false;
}
return true;
}
按照joostschouten的建议将@persist添加到anEnum也是一个好主意。
很高兴地说现在一切正常。