单击命令按钮后阻止rich:popupPanel关闭

时间:2016-07-25 08:59:30

标签: popup richfaces

当我点击命令按钮时,我希望我的面板保持可见,并且执行的方法会调用错误消息。

更具体地说,我有一个输入字段的验证器,它应该得到一个日期。如果此日期无效,则支持bean中的validate方法将生成错误消息。使用命令按钮后,应在弹出式面板的输入字段旁边显示。

单击命令按钮会关闭弹出窗口。但是,如果我重新打开它,会显示错误消息,让我想知道为什么它首先关闭,当最大的不满足条件没有得到满足时。

我的xhtml页面:

<h:body>
    <h:commandButton id="note" value="Neuer Satz">
        <rich:componentControl target="note_panel" operation="show" />
    </h:commandButton>

    <rich:popupPanel id="note_panel" modal="true" autosized="true"
        resizeable="false" header="Neuen Mehrwertsteuersatz vormerken"
        domElementAttachment="form">
                Gültig ab
                <h:inputText id="newVorGueltigAb"
            value="#{mehrwertsteuerBean.neuGueltigAb}" maxlength="10"
            validator="#{mehrwertsteuerBean.validateNewDate}" />
        <h:message for="newVorGueltigAb" style="color:red" />
        <h:commandButton value="Vormerken"
            action="#{mehrwertsteuerBean.addSteuersatz()}"
            oncomplete="if (#{facesContext.maximumSeverity==null}) 
                  #{rich:component('note_panel')}.hide(); return false;" />
        <h:commandButton value="Abbrechen"
            onclick="#{rich:component('note_panel')}.hide(); return false;" />
    </rich:popupPanel>
</h:body>

支持bean中的验证方法:

public void validateNewDate(FacesContext context, UIComponent toValidate,
            Object value) {
        String regex = "([0-9]{2}).([0-9]{2}).([0-9]{4})";
        String date = (String) value;
        if (date.matches(regex)) {
            validNewDate = true;
        } else {
            validNewDate = false;
            String message = "Bitte gültiges Datum eingeben!";
            context.addMessage(toValidate.getClientId(context),
                    new FacesMessage(message));

        }
}

1 个答案:

答案 0 :(得分:0)

首先,当您希望验证失败时,您必须抛出异常。所以看起来应该是这样的:

public void validateNewDate(FacesContext context, UIComponent toValidate, Object value) {
    String regex = "([0-9]{2}).([0-9]{2}).([0-9]{4})";
    String date = (String) value;
    if (!date.matches(regex)) {
        String message = "Bitte gültiges Datum eingeben!";
        throw new ValidatorException(
            new FacesMessage(FacesMessage.SEVERITY_ERROR, message, null));
    }
}

如果您这样做,则模型中不会发生任何更改,并且会触发您commandButton WON&T中的操作。这是JSF验证的正确流程。

第二件事。您必须手动处理验证错误。要检查我是否有错误,请使用此功能:

public boolean isNoErrorsOccured() {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    return ((facesContext.getMaximumSeverity() == null) || 
                (facesContext.getMaximumSeverity()
                    .compareTo(FacesMessage.SEVERITY_INFO) <= 0));
}

这样你的a4j:commandButton可能如下所示:

<a4j:commandButton value="Vormerken" execute="note_panel"
    action="#{mehrwertsteuerBean.addSteuersatz}"
    render="note_panel"
    oncomplete="if (#{facesHelper.noErrorsOccured}) {#{rich:component('note_panel')}.hide();}
                else { console.log('OMG! I\'ve got an error!'); }" />

<强>更新

所有应该看起来像这样:

<rich:popupPanel id="note_panel" modal="true" autosized="true" resizeable="false"
    header="Neuen Mehrwertsteuersatz vormerken" domElementAttachment="body">
    Gültig ab
    <h:form>
        <h:inputText id="newVorGueltigAb" value="#{mehrwertsteuerBean.neuGueltigAb}" maxlength="10"
            validator="#{mehrwertsteuerBean.validateNewDate}" />
        <h:message for="newVorGueltigAb" style="color:red" />
        <a4j:commandButton value="Vormerken" execute="@form" action="#{mehrwertsteuerBean.addSteuersatz}"
            render="@form"
            oncomplete="if (#{mehrwertsteuerBean.noErrorsOccured}) {#{rich:component('note_panel')}.hide();}" />
        <h:commandButton value="Abbrechen"
            onclick="#{rich:component('note_panel')}.hide(); return false;" />
    </h:form>
</rich:popupPanel>

注意:

  • 缺少<h:form> !!!
  • render属性,因为您必须在验证错误时呈现面板。
  • action末尾没有括号。
  • execute属性设置为仅弹出。这将导致整个表单中的其他字段都不会更新。
  • 由于h:form位于弹出窗口内,我已将domElementAttachment更改为正文。