【问题标题】:After validation jsf fails to reset values验证后 jsf 无法重置值
【发布时间】:2012-07-11 08:40:09
【问题描述】:

我有一个由两个 p:calendar 组件实现的 jsf 复合组件。 这个想法是选择第一个日历时,需要重置第二个日历的值。验证时出现问题,没有执行第二个日历的重置。

阅读帖子后,我决定在我的验证器中使用 EditableValueHolder。 我有自定义验证器:我在其中添加了以下代码:

@Override

public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException {
//....
resetValues(fc);
}

public void resetValues(FacesContext fc) {
    PartialViewContext partialViewContext = fc.getPartialViewContext();
    Collection<String> renderIds = partialViewContext.getRenderIds();
    UIComponent input;
    UIViewRoot viewRoot = fc.getViewRoot();
    for (String renderId : renderIds) {
        input = viewRoot.findComponent(renderId);
        if (input.isRendered() && input instanceof EditableValueHolder) {
            EditableValueHolder editableValueHolder = (EditableValueHolder) input;
            editableValueHolder.setSubmittedValue(null);
            editableValueHolder.setValue(null);
            editableValueHolder.setValid(true);
            editableValueHolder.setLocalValueSet(false);
        }
    }
}

调试后我可以看到每一行代码都通过了,但是jsf端什么都没有发生。

【问题讨论】:

    标签: jsf primefaces java-ee-6


    【解决方案1】:

    现在不是重置值的正确时机。在validate() 方法离开后,它们将被当前组件覆盖,并且一旦被验证,它们也会被第二个日历覆盖。您需要在更新模型值阶段之后的某处执行重置,最好是在调用操作阶段之前,以便您有机会在操作(侦听器)方法中更改模型值。您可以为此使用ActionListenerPhaseListener

    顺便说一句,JSF 实用程序库 OmniFaces 有一个可重用的解决方案,类似于 ResetInputAjaxActionListener

    【讨论】:

      猜你喜欢
      • 2011-09-13
      • 2018-09-15
      • 2011-06-01
      • 2017-11-10
      • 2022-01-09
      • 2012-11-25
      • 1970-01-01
      • 2012-12-11
      相关资源
      最近更新 更多