Деактивация функциональности commandButton, если проверка inputText завершается неудачно или начинается вызов ajax - PullRequest
13 голосов
/ 17 января 2012

У меня есть следующий фрагмент кода внутри формы:

<p:panel id="panel" header="lalalala">
    <h:panelGrid columns="5">

        <h:outputLabel value="Enter name" for="name" />

        <p:inputText id="name" value="#{userBean.name}"
            required="true" label="name" maxlength="15"
            validatorMessage="oops"
            requiredMessage="ooopps">
            <f:validateRegex
                pattern="^somepattern$">
            </f:validateRegex>
            <p:ajax event="blur" update="inputValidationMessage" />
        </p:inputText>

        <p:message id="inputValidationMessage" showSummary="false"
            for="name" />
        <p:watermark for="name" value="eg. John" />

    </h:panelGrid>

    <p:commandButton id="submitButton" value="Submit" update="panel"
        actionListener="#{userBean.save}"
        onclick="handleOnclick"
        oncomplete="handleAjaxResponse(xhr, status, args)">
    </p:commandButton>
    <p:messages autoUpdate="true" globalOnly="true" showDetail="true" />
</p:panel>

Таким образом, сообщения проверки корректно работают с элементом inputText. Но кнопка отправки по-прежнему выполняет Ajax-запрос при нажатии, даже если ввод неверен. Я хочу, чтобы запрос Ajax отправлялся, если inputText действителен.

Как мне это сделать?

Кроме; есть еще один случай, когда я хотел бы отключить кнопку. Это тот случай, когда inputText проверяется, и пользователь нажимает кнопку. Причина этого в том, что я не хочу, чтобы пользователь по ошибке заливал запросы. (т.е. несколько раз нажмите кнопку отправки)

В настоящее время функция javascript handleOnclick показывает только модальное диалоговое окно с надписью «подождите». Поскольку этот диалог является модальным, фон недоступен. Тем не менее, это по-прежнему не мешает пользователю нажимать его несколько раз, потому что между нажатием кнопки мыши и модальным диалогом проходит 1 секунда. Более того; этот подход не предотвращает предоставление неверных данных. Что вы можете предложить?

Я использую JSF2.0 и Primefaces 3.0.

Любая помощь приветствуется.

1 Ответ

18 голосов
/ 17 января 2012

Вы можете использовать для нее атрибут disabled кнопки.Просто установите его на true всякий раз, когда FacesContext#isPostback() возвращает false (таким образом, это первоначальный запрос), или когда это true (таким образом, отправка формы произошла), затем проверьте, если FacesContext#isValidationFailed() возвращает true (поэтому проверка в целом не удалась).

<p:commandButton ... disabled="#{not facesContext.postback or facesContext.validationFailed}" />

Необходимо только обновить кнопку на запросах ajax, чтобы онапоявится снова включенным или отключенным при необходимости.

<p:ajax event="blur" update="inputValidationMessage submitButton" />
...