0

我在更改时更新区域的表单中有一个 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();
    }
}

我遇到的问题是,当我提交表单并在 java 类中的 onValidate 方法中处理验证时,页面会重新呈现并显示错误的区域 - 通常是区域 3(这可能是有意义的,因为它是“其他”在上面的方法中返回)。如何让正确的区域再次渲染 - 我在 anEnum 上尝试了@persist 但没有运气,以下也不起作用

@SetupRender
void setupRender() {
  updateDisplay(anEnum);
}

任何帮助表示赞赏!

4

2 回答 2

1

您正在检查 中的anTypeEnum实例变量getZone(),并在其中设置anEnum实例变量updateDisplay()。如果这不是您的问题中的拼写错误,那就是您的问题。

如果这是一个错字,anTypeEnum由于某种原因将为空。但是如果没有您的完整代码,我无法评论这是如何发生的。如果您不这样做@Persist或使用onPassivate()andonActivate()来跨请求保留值,它将在表单提交和页面呈现之间被清除。它应该可以使用,@Persist因此您必须以一种或另一种方式将其设置为空。请分享您的完整组件/页面代码。

PS:代替zone="${getZone()}"使用zone="zone"

于 2013-06-14T12:45:09.717 回答
0

我找到了问题的答案——如果我之前发布了更完整的代码,社区成员可能已经找到了答案(吸取了教训!)。

按照我在使用 Select 更新区域时看到的示例(很抱歉,我已经失去了链接),我已将两个区域之一设置为可见 =“false”。

<t:zone t:id="zone1" id="Zone1" visible="false">

这意味着即使页面在验证后重新呈现, visible= false 也是先例。我更新了代码以调用 java 中的方法来检查区域是否可见。

tml

<t:zone t:id="zone1" id="Zone1" visible="${isZoneVisible()}">

爪哇

public boolean isZoneVisible() {
    if (anEnum== AnEnum.TYPE1) {
        return false;
    }
    return true;
}

按照 joostschouten 的建议,将 @persist 添加到 anEnum 也是一个好主意。

很高兴地说现在一切都按预期工作。

于 2013-06-17T12:40:28.610 回答