Primefaces - Выполнение Javascript только после прохождения валидации, но до вызова метода действия - PullRequest
1 голос
/ 30 января 2020

У меня есть диалоговое окно Primefaces с формой, где пользователь вводит некоторые данные. После нажатия кнопки «Сохранить» мне нужно проверить данные (стандартным способом JSF), и если они пройдут, необходимо вызвать некоторый Javascript, чтобы отобразить неопределенный индикатор выполнения и скрыть кнопки формы - это потому, что Метод действия может занять несколько секунд из-за тяжелой обработки бэкенда .

В данный момент javascript явно выполняется при нажатии кнопки, но я не уверен, как поступить. Есть ли способ запустить функцию referPressed только после того, как проверка пройдена, но до вызова метода действия?

Фрагмент JSF

<p:commandButton value="Refer" actionListener="#{manageTrickleData.setLogToReferred}" 
onclick="referPressed();" update="subview1:mainForm:tabs:tablePanel2 
subview1:mainForm:tabs:tablePanel commentMessage" styleClass="dialogButtons">
</p:commandButton>

Javascript

function referPressed() {
    $('.dialogButtons').hide(); 
    $('.ui-progressbar-indeterminate').show();  
}

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Вы можете использовать <p:remoteCommand> для этого. Просто позвольте <p:commandButton> вызвать его по завершению без ошибок проверки, а затем позвольте <p:remoteCommand> вызвать желаемое действие.

<p:commandButton value="Refer" styleClass="dialogButtons"
    update="commentMessage"
    oncomplete="if (!args.validationFailed) { referPressed(); setLogToReferred(); }">
</p:commandButton>
<p:remoteCommand name="setLogToReferred"
    action="#{manageTrickleData.setLogToReferred}"
    update="subview1:mainForm:tabs:tablePanel2 subview1:mainForm:tabs:tablePanel">
</p:remoteCommand>
0 голосов
/ 30 марта 2020

Как указано в комментариях, это невозможно, поскольку проверка происходит на стороне сервера.

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

<p:inputText value="#{bean.entity.comment}">
    <p:ajax event="change" update="btnSave"/>
</p:inputText>

<p:commandButton id="btnSave" disabled="#{bean.entity.comment ne null}" onStart="referPressed();" onComplete="hideProgressBar();"/>

Чтобы сделать это более гибким, вы можете вызывать проверку bean-компонентов программно или выполнять пользовательские проверки, такие как:

<p:commandButton id="btnSave" disabled="#{not bean.isValid(bean.entity)}" />

Эти решения показывают проблемы на стороне сервера проверки JSF. Нам, программистам, понадобится, чтобы JSF сделал два запроса к серверу и позволил нам подключиться после фазы проверки, добавив новое состояние обратного вызова ajax, например onEvent="if (data.status == 'validate') { }; или для простых лиц onValidate, чтобы решить эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...