我在一个表单中有一个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);
}感谢任何人的帮助!
发布于 2013-06-14 20:45:10
在getZone()中检查anTypeEnum实例变量,在updateDisplay()中设置anEnum实例变量。如果这不是你问题中的拼写错误,那就是你的问题。
如果这是一个拼写错误,由于某种原因,anTypeEnum将为null。但是没有你的完整代码,我不能评论这是如何发生的。如果您不@Persist它,或者使用onPassivate()和onActivate()跨请求持久化值,它将在表单提交和页面呈现之间被清除。它应该可以与@Persist一起工作,因此您必须以某种方式将其设置为null。请分享您完整的组件/页面代码。
PS:使用zone="zone"代替zone="${getZone()}"
发布于 2013-06-17 20:40:29
我找到了这个问题的答案-如果我早点发布更完整的代码,可能会被社区成员找到(学到的教训!)。
按照我看到的一个例子(抱歉,我后来失去了链接),关于使用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的建议,向anEnum添加一个@persist也是一个好主意。
很高兴地说,现在一切都像预期的那样工作。
https://stackoverflow.com/questions/17108244
复制相似问题