поздно, но у меня была такая же проблема.
Ajax рендерится до того, как моя логика JSF завершена. Мое решение? Ну, я добавил диалог подтверждения. Я знаю, что это не техническое решение, но эй, оно работает. Как только пользователь нажимает «ОК» в диалоговом окне (это занимает около секунды, в этот раз логика должна быть выполнена), компонент должен быть визуализирован. Удачи, надеюсь, это поможет.
До изменений:
<h:commandButton action="#{bean.buisnessLogic(param1, param2)}">
<f:ajax
execute="components"
render="table"
/>
</h:commandButton>
После изменений:
<h:commandButton onclick="javascriptCofirm();" action="#{bean.buisnessLogic(param1, param2)}">
<f:ajax
execute="components"
/>
</h:commandButton>
<h:commandButton id="button" style="display: none">
<f:ajax
render="table"
/>
</h:commandButton>
JavaScript:
function javascriptConfirm() {
bootbox.alert("Se agrego la accion con exito.", function () {
var boton = document.getElementById("button");
boton.click();
});
e.preventdefault();
return false;
}
Что я сделал:
Итак, до внесения изменений. Мой commandButton будет отображать таблицу до добавления регистров. Например, я добавил бы строку 2, и она не показала бы изменения, пока страница не была обновлена или строка 3 была добавлена. Я провел небольшое исследование и пришел к выводу, что jsf переводит тег ajax в javascript, а javascript непосредственно выполняет код, не дожидаясь завершения действия.
Решение:
Итак, теперь я удаляю атрибут рендеринга из ajax и создаю другую commandButton, а в новой commandButton я добавляю рендер. Метод javascriptConfirm вызывает кнопку и «щелкает по ней». Это отображает страницу, но к тому времени, когда они подтверждают, что логика бизнеса завершена. Так что да. Это, вероятно, сбивает с толку. Что бы вы ни комментировали, я постараюсь ответить как можно быстрее (возможно, не так быстро).