Используя JSF 2, я понимаю, что могу вызывать несколько actionListeners как таковые:
<h:commandButton value = "Action">
<f:actionListener binding = "#{myBean.actionOne()}" />
<f:actionListener binding = "#{myBean.actionTwo()}" />
</h:commandButton>
Однако я хотел бы вызвать один actionListener и выполнить update
в @form. Как только этот первый вызов и обновление завершены, вызовите второй actionListener и выполните еще один update
. Это возможно?
Да. С помощью <h:commandScript>.
<h:form>
...
<h:commandButton value = "Action" action = "#{myBean.actionOne}">
<f:ajax render = "@form" onevent = "function(data) {
if (data.status === 'success') actionTwo();
}"/>
</h:commandButton>
<h:commandScript name = "actionTwo" action = "#{myBean.actionTwo}"
render = "...">
</h:commandScript>
</h:form>
Если вы еще не используете JSF 2.3, см. Как вызвать управляемый компонент JSF для события HTML DOM с помощью собственного JavaScript? для альтернатив.
В случае, если вы используете PrimeFaces (это подтверждает история ваших вопросов и используется термин «обновление» вместо «рендеринг»), <p:remoteCommand> является эквивалентом.
<h:form>
...
<p:commandButton value = "Action" action = "#{myBean.actionOne}"
update = "@form" oncomplete = "actionTwo()">
</p:commandButton>
<p:remoteCommand name = "actionTwo" action = "#{myBean.actionTwo}"
update = "...">
</p:remoteCommand>
</h:form>