有点晚了,但我遇到了同样的问题。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 中删除 render 属性并创建另一个 commandButton 并在新的 commandButton 中添加渲染。javascriptConfirm 方法调用按钮并“单击它”。这会呈现页面,但在他们确认业务逻辑完成时。是的。这可能令人困惑。好吧,无论您发表什么评论,我都会尽快回复(可能不会那么快)。